mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-22 21:03:53 +00:00
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.
243 lines
7.2 KiB
C
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 */
|