Files
mercury/runtime/mercury_stacks.h
Zoltan Somogyi 566cec5b30 Prefix everything defined in runtime/mercury_{stacks,tags}.h MR_.
Estimated hours taken: 3

Prefix everything defined in runtime/mercury_{stacks,tags}.h MR_.
In the process, get rid of the grade component MR_DEBUG_NONDET_STACK,
since this makes the update to mercury_stacks.h simpler and its use is
long obsolete.

runtime/mercury_tags.h:
	Put MR_ prefixes in front of everything defined here.

runtime/mercury_stacks.h:
	Put MR_ prefixes in front of everything defined here.

	Remove support for MR_DEBUG_NONDET_STACK. Replace most of the
	lost functionality by calling an updated mkframe_msg.

	Remove the definitions of push() and pop(). Their use conflicts with
	the idea that everything on the det stack is part of a frame, which
	the RTTI stuff depends on.

runtime/mercury_bootstrap.h:
	Add backward compatibility macros for the old names in the above two
	files.

	Remove some old entries in this file which are no longer needed.

runtime/mercury_wrapper.c:
	Remove the only uses of push() and pop().

	Put MR_ in front of some things that need them.

runtime/mercury_engine.c:
	Put MR_ in front of some things that need them.

runtime/mercury_misc.[ch]:
	Make mkframe_msg get the name of the procedure that owns the stack
	frame from an explicitly passed argument, rather than the prednm slot
	(which no longer exists). This actually improves low-level debugging
	support without MR_DEBUG_NONDET_STACK.

	Remove unnecessary return statements.

runtime/mercury_debug.h:
	Pass on the new arg of mkframe_msg.

	Fix long lines.

runtime/mercury_conf_param.h:
	Remove the documentation of MR_DEBUG_NONDET_STACK.

runtime/mercury_grade.h:
	Remove the grade component of MR_DEBUG_NONDET_STACK.

doc/reference_manual.texi:
	Document the MR_ prefixed versions of list_empty, list_cons etc.

library/io.m:
library/std_util.m:
library/string.m:
	Add prefixes to some references to the runtime.
1999-04-30 04:25:43 +00:00

243 lines
7.2 KiB
C

/*
** Copyright (C) 1995-1999 The 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.
*/
/* mercury_stacks.h - definitions for manipulating the det and nondet stacks */
#ifndef MERCURY_STACKS_H
#define MERCURY_STACKS_H
#include "mercury_regs.h"
#include "mercury_types.h"
#include "mercury_overflow.h"
#include "mercury_debug.h"
#include "mercury_goto.h"
#include "mercury_tabling.h"
/* DEFINITIONS FOR MANIPULATING THE DET STACK */
#define MR_based_stackvar(base_sp, n) ((base_sp)[-(n)])
#define MR_stackvar(n) MR_based_stackvar(MR_sp, n)
#define MR_incr_sp_push_msg(n, msg) \
( \
debugincrsp(n, MR_sp), \
dump_push_msg(msg), \
MR_sp = MR_sp + (n), \
detstack_overflow_check(), \
(void)0 \
)
#define MR_decr_sp_pop_msg(n) \
( \
debugdecrsp(n, MR_sp), \
dump_pop_msg(), \
MR_sp = MR_sp - (n), \
detstack_underflow_check(), \
(void)0 \
)
#define MR_incr_sp(n) ( \
debugincrsp(n, MR_sp), \
MR_sp = MR_sp + (n), \
detstack_overflow_check(), \
(void)0 \
)
#define MR_decr_sp(n) ( \
debugdecrsp(n, MR_sp), \
MR_sp = MR_sp - (n), \
detstack_underflow_check(), \
(void)0 \
)
/* DEFINITIONS FOR NONDET STACK FRAMES */
#define MR_PREVFR (-0) /* prev frame on stack, set up at call */
#define MR_REDOIP (-1) /* in this proc, set up at clause entry */
#define MR_REDOFR (-2) /* value for curfr on backtracking */
#define MR_SUCCIP (-3) /* in caller proc, set up at call */
#define MR_SUCCFR (-4) /* frame of caller proc, set up at call */
#define MR_DETFR (-3) /* sp, in model_det temp frames only */
/*
** Code that traverses the nondet stack depends on the relationship
** MR_NONDET_TEMP_SIZE < MR_DET_TEMP_SIZE < MR_NONDET_FIXED_SIZE.
** All three sizes are measured in words.
*/
#define MR_NONDET_TEMP_SIZE 3 /* prevfr, redoip, redofr */
#define MR_DET_TEMP_SIZE 4 /* prevfr, redoip, redofr, detfr */
#define MR_NONDET_FIXED_SIZE 5 /* prevfr, redoip, redofr, succip, succfr */
#define MR_SAVEVAL (-MR_NONDET_FIXED_SIZE)
/* saved values start at this offset */
#define MR_prevfr_addr(fr) (&((Word *) (fr))[MR_PREVFR])
#define MR_redoip_addr(fr) (&((Word *) (fr))[MR_REDOIP])
#define MR_redofr_addr(fr) (&((Word *) (fr))[MR_REDOFR])
#define MR_succip_addr(fr) (&((Word *) (fr))[MR_SUCCIP])
#define MR_succfr_addr(fr) (&((Word *) (fr))[MR_SUCCFR])
#define MR_detfr_addr(fr) (&((Word *) (fr))[MR_DETFR])
#define MR_based_framevar_addr(fr, n) \
(&(((Word *) (fr))[MR_SAVEVAL + 1 - (n)]))
#define MR_prevfr_slot(fr) LVALUE_CAST(Word *, ((Word *) (fr))[MR_PREVFR])
#define MR_redoip_slot(fr) LVALUE_CAST(Code *, ((Word *) (fr))[MR_REDOIP])
#define MR_redofr_slot(fr) LVALUE_CAST(Word *, ((Word *) (fr))[MR_REDOFR])
#define MR_succip_slot(fr) LVALUE_CAST(Code *, ((Word *) (fr))[MR_SUCCIP])
#define MR_succfr_slot(fr) LVALUE_CAST(Word *, ((Word *) (fr))[MR_SUCCFR])
#define MR_detfr_slot(fr) LVALUE_CAST(Word *, ((Word *) (fr))[MR_DETFR])
#define MR_based_framevar(fr, n) (((Word *) (fr))[MR_SAVEVAL + 1 - (n)])
#define MR_framevar(n) MR_based_framevar(MR_curfr, n)
/* DEFINITIONS FOR MANIPULATING THE NONDET STACK */
#define MR_mkframe(predname, numslots, redoip) \
do { \
reg Word *prevfr; \
reg Word *succfr; \
\
prevfr = MR_maxfr; \
succfr = MR_curfr; \
MR_maxfr += (MR_NONDET_FIXED_SIZE + numslots);\
MR_curfr = MR_maxfr; \
MR_redoip_slot(MR_curfr) = redoip; \
MR_prevfr_slot(MR_curfr) = prevfr; \
MR_succip_slot(MR_curfr) = MR_succip; \
MR_succfr_slot(MR_curfr) = succfr; \
MR_redofr_slot(MR_curfr) = MR_curfr; \
debugmkframe(predname); \
nondstack_overflow_check(); \
} while (0)
/* convert a size in bytes to a size in words, rounding up if necessary */
#define MR_bytes_to_words(x) (((x) + sizeof(Word) - 1) / sizeof(Word))
/* just like mkframe, but also reserves space for a struct */
/* with the given tag at the bottom of the nondet stack frame */
#define MR_mkpragmaframe(predname, numslots, structname, redoip) \
do { \
reg Word *prevfr; \
reg Word *succfr; \
\
prevfr = MR_maxfr; \
succfr = MR_curfr; \
MR_maxfr += MR_NONDET_FIXED_SIZE + numslots + \
MR_bytes_to_words(sizeof(struct structname)); \
MR_curfr = MR_maxfr; \
MR_redoip_slot(MR_curfr) = redoip; \
MR_prevfr_slot(MR_curfr) = prevfr; \
MR_succip_slot(MR_curfr) = MR_succip; \
MR_succfr_slot(MR_curfr) = succfr; \
MR_redofr_slot(MR_curfr) = MR_curfr; \
debugmkframe(predname); \
nondstack_overflow_check(); \
} while (0)
#define MR_mktempframe(redoip) \
do { \
reg Word *prevfr; \
reg Word *succfr; \
\
prevfr = MR_maxfr; \
succfr = MR_curfr; \
MR_maxfr += MR_NONDET_TEMP_SIZE; \
MR_prevfr_slot(MR_maxfr) = prevfr; \
MR_redoip_slot(MR_maxfr) = redoip; \
MR_redofr_slot(MR_maxfr) = MR_curfr; \
nondstack_overflow_check(); \
} while (0)
#define MR_mkdettempframe(redoip) \
do { \
reg Word *prevfr; \
reg Word *succfr; \
\
prevfr = MR_maxfr; \
succfr = MR_curfr; \
MR_maxfr += MR_DET_TEMP_SIZE; \
MR_prevfr_slot(MR_maxfr) = prevfr; \
MR_redoip_slot(MR_maxfr) = redoip; \
MR_redofr_slot(MR_maxfr) = MR_curfr; \
MR_detfr_slot(MR_maxfr) = MR_sp; \
nondstack_overflow_check(); \
} while (0)
#define MR_succeed() do { \
reg Word *childfr; \
\
debugsucceed(); \
childfr = MR_curfr; \
MR_curfr = MR_succfr_slot(childfr); \
GOTO(MR_succip_slot(childfr)); \
} while (0)
#define MR_succeed_discard() \
do { \
reg Word *childfr; \
\
debugsucceeddiscard(); \
childfr = MR_curfr; \
MR_maxfr = MR_prevfr_slot(childfr); \
MR_curfr = MR_succfr_slot(childfr); \
GOTO(MR_succip_slot(childfr)); \
} while (0)
#define MR_fail() do { \
debugfail(); \
MR_maxfr = MR_prevfr_slot(MR_maxfr); \
nondstack_underflow_check(); \
MR_curfr = MR_redofr_slot(MR_maxfr); \
GOTO(MR_redoip_slot(MR_maxfr)); \
} while (0)
#define MR_redo() do { \
debugredo(); \
MR_curfr = MR_redofr_slot(MR_maxfr); \
GOTO(MR_redoip_slot(MR_maxfr)); \
} while (0)
#ifdef MR_USE_MINIMAL_MODEL
/* DEFINITIONS FOR GENERATOR STACK FRAMES */
typedef struct MR_GeneratorStackFrameStruct {
Word *generator_frame;
MR_Subgoal *generator_table;
} MR_GeneratorStackFrame;
extern void MR_push_generator(Word *frame_addr,
MR_Subgoal *table_addr);
extern MR_Subgoal *MR_top_generator_table(void);
extern void MR_pop_generator(void);
extern void MR_print_gen_stack(FILE *fp);
/* DEFINITIONS FOR CUT STACK FRAMES */
typedef struct MR_CutGeneratorListNode *MR_CutGeneratorList;
struct MR_CutGeneratorListNode {
MR_Subgoal **generator_ptr;
MR_CutGeneratorList next_generator;
};
typedef struct MR_CutStackFrameStruct {
Word *frame;
Integer gen_next;
MR_CutGeneratorList generators;
} MR_CutStackFrame;
extern void MR_commit_mark(void);
extern void MR_commit_cut(void);
extern void MR_register_generator_ptr(MR_Subgoal **);
#endif /* MR_USE_MINIMAL_MODEL */
#endif /* not MERCURY_STACKS_H */