mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-22 12:53:47 +00:00
Mmake: Separated out the handwritten .c files from those generated from .mods. Added a rule for invoking ctags. engine.c: Remove the label do_reset_framevar0_fail, an anachronism. Some formatting changes. io_rt.mod: Flush stdout when processing error/1. memory.c: Print out the PC in the SIGBUS handler as well as the SIGSEGV handler. Some formatting changes. stacks.h: Cast pointers to nondet frames to (Word *) before use. If they are stored in e.g. detstackvars, their native type is just Word. table.c: Strengthened debugging capability. A check for whether the hash value is within bounds is now turned on by default. Later we can turn it off again. wrapper.mod: Changed initialization code to always allocate space for the label table, even if init_modules does not need to be called. This avoids a crash in some situations.
146 lines
3.4 KiB
C
146 lines
3.4 KiB
C
/*
|
|
** Copyright (C) 1995 University of Melbourne.
|
|
** This file may only be copied under the terms of the GNU Library General
|
|
** Public License - see the file COPYING.LIB in the Mercury distribution.
|
|
*/
|
|
|
|
/* DEFINITIONS FOR MANIPULATING THE DET STACK */
|
|
|
|
#define detstackvar(n) sp[-n]
|
|
|
|
#define incr_sp(n) ( \
|
|
debugincrsp(n, sp), \
|
|
sp = sp + (n), \
|
|
detstack_overflow_check(), \
|
|
(void)0 \
|
|
)
|
|
|
|
#define decr_sp(n) ( \
|
|
debugdecrsp(n, sp), \
|
|
sp = sp - (n), \
|
|
detstack_underflow_check(), \
|
|
(void)0 \
|
|
)
|
|
|
|
|
|
#define push(w) ( \
|
|
*sp = (Word) (w), \
|
|
debugpush(*sp, sp), \
|
|
sp = sp + 1, \
|
|
detstack_overflow_check(), \
|
|
(void)0 \
|
|
)
|
|
|
|
#define pop() ( \
|
|
sp = sp - 1, \
|
|
debugpop(*sp, sp), \
|
|
detstack_underflow_check(), \
|
|
/* return */ *sp \
|
|
)
|
|
|
|
/* DEFINITIONS FOR NONDET STACK FRAMES */
|
|
|
|
#define REDOIP (-0) /* in this proc, set up at clause entry */
|
|
#define PREVFR (-1) /* prev frame on stack, set up at call */
|
|
#define SUCCIP (-2) /* in caller proc, set up at call */
|
|
#define SUCCFR (-3) /* frame of caller proc, set up at call */
|
|
|
|
#ifdef SPEED
|
|
#define bt_prednm(fr) "unknown"
|
|
#define NONDET_FIXED_SIZE_0 4 /* units: words */
|
|
#else
|
|
#define PREDNM (-4) /* for debugging, set up at call */
|
|
#define bt_prednm(fr) LVALUE_CAST(const char *, ((Word *) fr)[PREDNM])
|
|
#define NONDET_FIXED_SIZE_0 5 /* units: words */
|
|
#endif
|
|
|
|
#define NONDET_FIXED_SIZE NONDET_FIXED_SIZE_0
|
|
|
|
#define SAVEVAL (-NONDET_FIXED_SIZE)
|
|
/* saved values start at this offset */
|
|
|
|
#define bt_redoip(fr) LVALUE_CAST(Code *, ((Word *) fr)[REDOIP])
|
|
#define bt_prevfr(fr) LVALUE_CAST(Word *, ((Word *) fr)[PREVFR])
|
|
#define bt_succip(fr) LVALUE_CAST(Code *, ((Word *) fr)[SUCCIP])
|
|
#define bt_succfr(fr) LVALUE_CAST(Word *, ((Word *) fr)[SUCCFR])
|
|
#define bt_var(fr,n) ((Word *) fr)[SAVEVAL-n]
|
|
|
|
#define curprednm bt_prednm(curfr)
|
|
#define curredoip bt_redoip(curfr)
|
|
#define curprevfr bt_prevfr(curfr)
|
|
#define cursuccip bt_succip(curfr)
|
|
#define cursuccfr bt_succfr(curfr)
|
|
#define framevar(n) bt_var(curfr,n)
|
|
|
|
/* DEFINITIONS FOR MANIPULATING THE NONDET STACK */
|
|
|
|
#ifndef SPEED
|
|
#define mkframe_save_prednm(prednm) (curprednm = prednm)
|
|
#else
|
|
#define mkframe_save_prednm(prednm) /* nothing */
|
|
#endif
|
|
|
|
|
|
#define mkframe(prednm, n, redoip) \
|
|
do { \
|
|
reg Word *prevfr; \
|
|
reg Word *succfr; \
|
|
\
|
|
prevfr = maxfr; \
|
|
succfr = curfr; \
|
|
maxfr += (NONDET_FIXED_SIZE + n);\
|
|
curfr = maxfr; \
|
|
curredoip = redoip; \
|
|
curprevfr = prevfr; \
|
|
cursuccip = succip; \
|
|
cursuccfr = succfr; \
|
|
mkframe_save_prednm(prednm); \
|
|
debugmkframe(); \
|
|
nondstack_overflow_check(); \
|
|
} while (0)
|
|
|
|
|
|
|
|
#define modframe(redoip) \
|
|
do { \
|
|
curredoip = redoip; \
|
|
debugmodframe(); \
|
|
} while (0)
|
|
|
|
|
|
#define succeed() do { \
|
|
reg Word *childfr; \
|
|
\
|
|
debugsucceed(); \
|
|
childfr = curfr; \
|
|
curfr = cursuccfr; \
|
|
GOTO(bt_succip(childfr)); \
|
|
} while (0)
|
|
|
|
#define succeed_discard() \
|
|
do { \
|
|
reg Word *childfr; \
|
|
\
|
|
debugsucceeddiscard(); \
|
|
childfr = curfr; \
|
|
maxfr = curprevfr; \
|
|
curfr = cursuccfr; \
|
|
GOTO(bt_succip(childfr)); \
|
|
} while (0)
|
|
|
|
|
|
#define fail() do { \
|
|
debugfail(); \
|
|
maxfr = curprevfr; \
|
|
curfr = maxfr; \
|
|
nondstack_underflow_check(); \
|
|
GOTO(curredoip); \
|
|
} while (0)
|
|
|
|
|
|
#define redo() do { \
|
|
debugredo(); \
|
|
curfr = maxfr; \
|
|
GOTO(curredoip); \
|
|
} while (0)
|