mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-12 04:14:06 +00:00
Also fix some bugs in related code, and improve the related debugging
infrastructure.
-------------------
runtime/mercury_stacks.[ch]:
Fix bug 314 for temp frames created by nondet procedures. The fix will
probably also work for *det* procedures that create temp frames on the
nondet stack, but I can't think of a way to test that, because det
procedures create such frames only in very specific circumstances,
and I cannot think of a way to nest a recursive call inside those
circumstances.
The problem was that when we were creating new temp frames on
the nondet stack, we did not check whether the current nondet stack segment
had room for them. We now do.
The stack trace tracing code needs to know the size of each nondet stack
frame, since it uses the size to classify frames as temp or ordinary.
The size is given by the difference in address between the address of the
frame and the address of the previous frame. This difference would yield
an incorrect size and hence an incorrect frame classification if a temp
frame were allowed to have a frame on a different segment as its
immediate predecessor.
We prevent this by putting an ordinary (i.e. non-temp) frame at the bottom
of every new nondet stack segment as a sentinel. We hand-build this frame,
since it is not an "ordinary" ordinary frame. It is not created by a call,
so it has no meaningful success continuation, and since it does not make
any calls, no other frame's success continuation can point to it either.
If backtracking reaches this sentinel frame, we use this fact to free
all the segments beyond the one the sentinel frame is in, but keep the
frame the sentinel frame is in, since we are likely to need it again.
Document the reason why MR_incr_sp_leaf() does not have to check
whether a new stack segment is needed. (See the fix to llds_out_instr.m
below.)
runtime/mercury_stack_trace.[ch]:
When traversing the nondet stack, treat the sentinel frame specially.
We have to, since it is an ordinary frame (i.e. it is not a temp frame),
but it is not an "ordinary" ordinary frame: it does not make calls,
and hence calls cannot return to it, and it does not return to any
other frame either. It therefore does not have the layout structures
(label and proc) that the nondet stack traversal expects to find.
Fix an old bug: the nondet stack traversal used a simple directional
pointer comparison to check whether it has reached the bottom of the nondet
stack. This is NOT guaranteed to work in the presence of stack segments:
depending on exactly what addresses new stack segments get, a stack frame
can have an address BELOW the address of the initial stack frame
even if it is logically ABOVE that stack frame.
Another old bug was that a difference between two pointers, which could
be 64 bit, was stored in an int, which could be 32 bit.
The nondet stack traversal code used a similar directional comparison
to implement optionally stopping at an arbitrary point on the nondet stack.
Fixing this facility (the limit_addr parameter of MR_dump_nondet_stack)
while preserving reasonable efficiency would not be trivial, but it would
also be pointless, since the facility is not actually used. This diff
deletes the parameter instead.
Move some loop invariant code out of its loop.
trace/mercury_trace_cmd_developer.c:
trace/mercury_trace_external.c:
Don't pass the now-deleted parameter to mercury_stack_trace.c.
runtime/mercury_wrapper.c:
Record the zone of the initial nondet stack frame, since the fix
of mercury_stack_trace.c needs that info, and it is much more efficient
to set it up just once.
tests/hard_coded/bug314.{m,exp}:
The regression test for this bug.
tests/hard_coded/Mercury.options:
Compile the new test case with the options it needs.
tests/hard_coded/Mmakefile:
Enable the new test case.
-------------------
runtime/mercury_wrapper.c:
The compiler knows the number of words in a stack frame it is creating,
not necessarily the number of bytes (though it could put bounds on that
from the number of tag bits). Since this size must sync with the runtime,
change the runtime's variable holding this size to also be in words.
Note that similar changes would also be beneficial for other sizes.
compiler/llds_out_instr.m:
Conform to the change in mercury_wrapper.c, fixing an old bug
(mercury_wrapper.c reserved 128 BYTES for leaf procedures, but
llds_out_instr.m was using that space for procedures whose frames
were up to 128 WORDS in size.)
compiler/mercury_memory.c:
Conform to the change in mercury_wrapper.c.
-------------------
runtime/mercury_memory_zones.h:
Instead of starting to use EVERY zone at a different offset, do this
only for the INITIAL zones in each memory area, since only on these
is it useful. When the program first starts up, it WILL be using
the initial parts of the det stack, nondet stack and heap, so it is
useful to make sure that these do not collide in the cache. However,
when we allocate e.g. the second zone in e.g. the nondet stack, we are
no more likely to be beating on the initial part of any segment
of the det stack than on any other part of such segments.
If a new debug macro, MR_DEBUG_STACK_SEGMENTS_SET_SIZE is set (to an int),
use only that many words in each segment. This allows the segment switchover
code to be exercised and debugged with smaller test cases.
runtime/mercury_conf_param.h:
Document the MR_DEBUG_STACK_SEGMENTS_SET_SIZE macro.
Convert this file to four-space indentation with tabs expanded.
-------------------
runtime/mercury_overflow.h:
Make abort messages from overflows and underflows more useful by including
more information.
runtime/mercury_overflow.c:
Add a new function to help with the better abort messages.
Since this file did not exist before, create it.
runtime/Mmakefile:
Add the new source file to the list of source files.
-------------------
runtime/mercury_debug.[ch]:
Fix problems with the formatting of the debugging output from existing
functions.
Add new functions for dumping info about memory zones.
Factor out some common code.
Convert the header file to four-space indentation.
-------------------
runtime/mercury_grade.c:
Generate an error if stack segments are specified together with stack
extension
-------------------
trace/.gitignore:
util/.gitignore:
tests/debugger/.gitignore:
List some more files.
-------------------
runtime/mercury_context.c:
runtime/mercury_engine.[ch]:
runtime/mercury_misc.h:
compiler/notes/failure.html:
Fix white space.
390 lines
15 KiB
C
390 lines
15 KiB
C
/*
|
|
** vim:ts=4 sw=4 expandtab
|
|
*/
|
|
/*
|
|
** Copyright (C) 1995-2000,2002, 2004, 2006, 2009-2011 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_misc.h - MR_warning(),
|
|
** MR_fatal_error()
|
|
*/
|
|
|
|
#ifndef MERCURY_MISC_H
|
|
#define MERCURY_MISC_H
|
|
|
|
#include "mercury_std.h" /* for `MR_NO_RETURN' */
|
|
#include <stdlib.h> /* for `size_t' */
|
|
|
|
extern void
|
|
MR_warning(const char *msg, ...);
|
|
|
|
/*
|
|
** For warnings from the debugger.
|
|
*/
|
|
extern void
|
|
MR_mdb_warning(const char *msg, ...);
|
|
|
|
extern void
|
|
MR_perror(const char *msg);
|
|
|
|
/*
|
|
**For errors from the debugger.
|
|
*/
|
|
extern void
|
|
MR_mdb_perror(const char *msg);
|
|
|
|
/*
|
|
** Output a message to standard error and abort.
|
|
** This function is for fatal errors in the Mercury runtime.
|
|
*/
|
|
MR_NO_RETURN(extern void \
|
|
MR_fatal_error(const char *msg, ...));
|
|
|
|
/*
|
|
** Output a message to standard error and abort.
|
|
** Prefix the message with the location of the component that caused the
|
|
** error.
|
|
** This is intended to be called from library bindings etc.
|
|
*/
|
|
MR_NO_RETURN(extern void \
|
|
MR_external_fatal_error(const char *locn, const char *msg, ...));
|
|
|
|
/*
|
|
** Register a function to be called (as func(data)) when the program is
|
|
** about to be terminated due to an uncaught exception.
|
|
*/
|
|
extern void
|
|
MR_register_exception_cleanup(void (*func)(void *), void *data);
|
|
|
|
/*
|
|
** Call all the functions registered with MR_register_exception_cleanup.
|
|
** Should be invoked only when the program is about to be terminated
|
|
** due to an uncaught exception.
|
|
*/
|
|
extern void
|
|
MR_perform_registered_exception_cleanups(void);
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/*
|
|
** These macros are shorthands to allow reductions in the size of compiler
|
|
** generated C source files.
|
|
*/
|
|
|
|
#define MR_COMMON_TYPE(typenum) \
|
|
MR_PASTE2(mercury_type_, typenum)
|
|
|
|
#define MR_COMMON_NAME(cellnum) \
|
|
MR_PASTE2(mercury_common_, cellnum)
|
|
|
|
#define MR_COMMON(typenum, cellnum) \
|
|
((MR_Word *) &MR_COMMON_NAME(typenum)[cellnum])
|
|
|
|
#define MR_XCOMMON(typenum, cellnum) \
|
|
((MR_Word *) &MR_COMMON_NAME(typenum)[cellnum])
|
|
|
|
#define MR_TAG_COMMON(tag, typenum, cellnum) \
|
|
(MR_mkword(MR_mktag(tag), MR_COMMON(typenum, cellnum)))
|
|
|
|
#define MR_TAG_XCOMMON(tag, typenum, cellnum) \
|
|
(MR_mkword(MR_mktag(tag), MR_XCOMMON(typenum, cellnum)))
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#define MR_pseudo_type_infos(m) \
|
|
MR_PASTE2(mercury_data__pseudo_type_info_array__, m)
|
|
|
|
#define MR_hlds_var_nums(m) \
|
|
MR_PASTE2(mercury_data__hlds_var_nums_array__, m)
|
|
|
|
#define MR_short_locns(m) \
|
|
MR_PASTE2(mercury_data__short_locns_array__, m)
|
|
|
|
#define MR_long_locns(m) \
|
|
MR_PASTE2(mercury_data__long_locns_array__, m)
|
|
|
|
#define MR_user_event_var_nums(m) \
|
|
MR_PASTE2(mercury_data__user_event_var_nums_array__, m)
|
|
|
|
#define MR_user_event_layouts(m) \
|
|
MR_PASTE2(mercury_data__user_event_layouts_array__, m)
|
|
|
|
#define MR_no_var_label_layouts(m) \
|
|
MR_PASTE2(mercury_data__no_var_label_layout_array__, m)
|
|
|
|
#define MR_svar_label_layouts(m) \
|
|
MR_PASTE2(mercury_data__svar_label_layout_array__, m)
|
|
|
|
#define MR_lvar_label_layouts(m) \
|
|
MR_PASTE2(mercury_data__lvar_label_layout_array__, m)
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#define MR_proc_call_sites(m) \
|
|
MR_PASTE2(mercury_data__proc_call_sites_array__, m)
|
|
|
|
#define MR_proc_cp_statics(m) \
|
|
MR_PASTE2(mercury_data__proc_cp_statics_array__, m)
|
|
|
|
#define MR_proc_cp_dynamics(m) \
|
|
MR_PASTE2(mercury_data__proc_cp_dynamics_array__, m)
|
|
|
|
#define MR_proc_statics(m) \
|
|
MR_PASTE2(mercury_data__proc_statics_array__, m)
|
|
|
|
#define MR_proc_head_var_nums(m) \
|
|
MR_PASTE2(mercury_data__proc_head_var_nums_array__, m)
|
|
|
|
#define MR_proc_var_names(m) \
|
|
MR_PASTE2(mercury_data__proc_var_names_array__, m)
|
|
|
|
#define MR_proc_body_bytecodes(m) \
|
|
MR_PASTE2(mercury_data__proc_body_bytecodes_array__, m)
|
|
|
|
#define MR_proc_table_io_decls(m) \
|
|
MR_PASTE2(mercury_data__proc_table_io_decls_array__, m)
|
|
|
|
#define MR_proc_event_layouts(m) \
|
|
MR_PASTE2(mercury_data__proc_event_layouts_array__, m)
|
|
|
|
#define MR_proc_exec_traces(m) \
|
|
MR_PASTE2(mercury_data__proc_exec_traces_array__, m)
|
|
|
|
#define MR_threadscope_strings(m) \
|
|
MR_PASTE2(mercury_data__threadscope_string_table_array__, m)
|
|
|
|
#define MR_alloc_sites(m) \
|
|
MR_PASTE2(mercury_data__alloc_sites_array__, m)
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#define MR_no_var_label_layout_refs1(m, s1) \
|
|
&MR_no_var_label_layouts(m)[s1],
|
|
|
|
#define MR_no_var_label_layout_refs2(m, s1, s2) \
|
|
MR_no_var_label_layout_refs1(m, s1) \
|
|
MR_no_var_label_layout_refs1(m, s2)
|
|
|
|
#define MR_no_var_label_layout_refs3(m, s1, s2, s3) \
|
|
MR_no_var_label_layout_refs1(m, s1) \
|
|
MR_no_var_label_layout_refs1(m, s2) \
|
|
MR_no_var_label_layout_refs1(m, s3)
|
|
|
|
#define MR_no_var_label_layout_refs4(m, s1, s2, s3, s4) \
|
|
MR_no_var_label_layout_refs1(m, s1) \
|
|
MR_no_var_label_layout_refs1(m, s2) \
|
|
MR_no_var_label_layout_refs1(m, s3) \
|
|
MR_no_var_label_layout_refs1(m, s4)
|
|
|
|
#define MR_no_var_label_layout_refs5(m, s1, s2, s3, s4, s5) \
|
|
MR_no_var_label_layout_refs1(m, s1) \
|
|
MR_no_var_label_layout_refs1(m, s2) \
|
|
MR_no_var_label_layout_refs1(m, s3) \
|
|
MR_no_var_label_layout_refs1(m, s4) \
|
|
MR_no_var_label_layout_refs1(m, s5)
|
|
|
|
#define MR_no_var_label_layout_refs6(m, s1, s2, s3, s4, s5, s6) \
|
|
MR_no_var_label_layout_refs1(m, s1) \
|
|
MR_no_var_label_layout_refs1(m, s2) \
|
|
MR_no_var_label_layout_refs1(m, s3) \
|
|
MR_no_var_label_layout_refs1(m, s4) \
|
|
MR_no_var_label_layout_refs1(m, s5) \
|
|
MR_no_var_label_layout_refs1(m, s6)
|
|
|
|
#define MR_no_var_label_layout_refs7(m, s1, s2, s3, s4, s5, s6, s7) \
|
|
MR_no_var_label_layout_refs1(m, s1) \
|
|
MR_no_var_label_layout_refs1(m, s2) \
|
|
MR_no_var_label_layout_refs1(m, s3) \
|
|
MR_no_var_label_layout_refs1(m, s4) \
|
|
MR_no_var_label_layout_refs1(m, s5) \
|
|
MR_no_var_label_layout_refs1(m, s6) \
|
|
MR_no_var_label_layout_refs1(m, s7)
|
|
|
|
#define MR_no_var_label_layout_refs8(m, s1, s2, s3, s4, s5, s6, s7, s8) \
|
|
MR_no_var_label_layout_refs1(m, s1) \
|
|
MR_no_var_label_layout_refs1(m, s2) \
|
|
MR_no_var_label_layout_refs1(m, s3) \
|
|
MR_no_var_label_layout_refs1(m, s4) \
|
|
MR_no_var_label_layout_refs1(m, s5) \
|
|
MR_no_var_label_layout_refs1(m, s6) \
|
|
MR_no_var_label_layout_refs1(m, s7) \
|
|
MR_no_var_label_layout_refs1(m, s8)
|
|
|
|
#define MR_no_var_label_layout_refs9(m, s1, s2, s3, s4, s5, s6, s7, s8, s9) \
|
|
MR_no_var_label_layout_refs1(m, s1) \
|
|
MR_no_var_label_layout_refs1(m, s2) \
|
|
MR_no_var_label_layout_refs1(m, s3) \
|
|
MR_no_var_label_layout_refs1(m, s4) \
|
|
MR_no_var_label_layout_refs1(m, s5) \
|
|
MR_no_var_label_layout_refs1(m, s6) \
|
|
MR_no_var_label_layout_refs1(m, s7) \
|
|
MR_no_var_label_layout_refs1(m, s8) \
|
|
MR_no_var_label_layout_refs1(m, s9)
|
|
|
|
#define MR_no_var_label_layout_refs10(m, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10) \
|
|
MR_no_var_label_layout_refs1(m, s1) \
|
|
MR_no_var_label_layout_refs1(m, s2) \
|
|
MR_no_var_label_layout_refs1(m, s3) \
|
|
MR_no_var_label_layout_refs1(m, s4) \
|
|
MR_no_var_label_layout_refs1(m, s5) \
|
|
MR_no_var_label_layout_refs1(m, s6) \
|
|
MR_no_var_label_layout_refs1(m, s7) \
|
|
MR_no_var_label_layout_refs1(m, s8) \
|
|
MR_no_var_label_layout_refs1(m, s9) \
|
|
MR_no_var_label_layout_refs1(m, s10)
|
|
|
|
#define MR_svar_label_layout_refs1(m, s1) \
|
|
(MR_LabelLayout *) &MR_svar_label_layouts(m)[s1],
|
|
|
|
#define MR_svar_label_layout_refs2(m, s1, s2) \
|
|
MR_svar_label_layout_refs1(m, s1) \
|
|
MR_svar_label_layout_refs1(m, s2)
|
|
|
|
#define MR_svar_label_layout_refs3(m, s1, s2, s3) \
|
|
MR_svar_label_layout_refs1(m, s1) \
|
|
MR_svar_label_layout_refs1(m, s2) \
|
|
MR_svar_label_layout_refs1(m, s3)
|
|
|
|
#define MR_svar_label_layout_refs4(m, s1, s2, s3, s4) \
|
|
MR_svar_label_layout_refs1(m, s1) \
|
|
MR_svar_label_layout_refs1(m, s2) \
|
|
MR_svar_label_layout_refs1(m, s3) \
|
|
MR_svar_label_layout_refs1(m, s4)
|
|
|
|
#define MR_svar_label_layout_refs5(m, s1, s2, s3, s4, s5) \
|
|
MR_svar_label_layout_refs1(m, s1) \
|
|
MR_svar_label_layout_refs1(m, s2) \
|
|
MR_svar_label_layout_refs1(m, s3) \
|
|
MR_svar_label_layout_refs1(m, s4) \
|
|
MR_svar_label_layout_refs1(m, s5)
|
|
|
|
#define MR_svar_label_layout_refs6(m, s1, s2, s3, s4, s5, s6) \
|
|
MR_svar_label_layout_refs1(m, s1) \
|
|
MR_svar_label_layout_refs1(m, s2) \
|
|
MR_svar_label_layout_refs1(m, s3) \
|
|
MR_svar_label_layout_refs1(m, s4) \
|
|
MR_svar_label_layout_refs1(m, s5) \
|
|
MR_svar_label_layout_refs1(m, s6)
|
|
|
|
#define MR_svar_label_layout_refs7(m, s1, s2, s3, s4, s5, s6, s7) \
|
|
MR_svar_label_layout_refs1(m, s1) \
|
|
MR_svar_label_layout_refs1(m, s2) \
|
|
MR_svar_label_layout_refs1(m, s3) \
|
|
MR_svar_label_layout_refs1(m, s4) \
|
|
MR_svar_label_layout_refs1(m, s5) \
|
|
MR_svar_label_layout_refs1(m, s6) \
|
|
MR_svar_label_layout_refs1(m, s7)
|
|
|
|
#define MR_svar_label_layout_refs8(m, s1, s2, s3, s4, s5, s6, s7, s8) \
|
|
MR_svar_label_layout_refs1(m, s1) \
|
|
MR_svar_label_layout_refs1(m, s2) \
|
|
MR_svar_label_layout_refs1(m, s3) \
|
|
MR_svar_label_layout_refs1(m, s4) \
|
|
MR_svar_label_layout_refs1(m, s5) \
|
|
MR_svar_label_layout_refs1(m, s6) \
|
|
MR_svar_label_layout_refs1(m, s7) \
|
|
MR_svar_label_layout_refs1(m, s8)
|
|
|
|
#define MR_svar_label_layout_refs9(m, s1, s2, s3, s4, s5, s6, s7, s8, s9) \
|
|
MR_svar_label_layout_refs1(m, s1) \
|
|
MR_svar_label_layout_refs1(m, s2) \
|
|
MR_svar_label_layout_refs1(m, s3) \
|
|
MR_svar_label_layout_refs1(m, s4) \
|
|
MR_svar_label_layout_refs1(m, s5) \
|
|
MR_svar_label_layout_refs1(m, s6) \
|
|
MR_svar_label_layout_refs1(m, s7) \
|
|
MR_svar_label_layout_refs1(m, s8) \
|
|
MR_svar_label_layout_refs1(m, s9)
|
|
|
|
#define MR_svar_label_layout_refs10(m, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10) \
|
|
MR_svar_label_layout_refs1(m, s1) \
|
|
MR_svar_label_layout_refs1(m, s2) \
|
|
MR_svar_label_layout_refs1(m, s3) \
|
|
MR_svar_label_layout_refs1(m, s4) \
|
|
MR_svar_label_layout_refs1(m, s5) \
|
|
MR_svar_label_layout_refs1(m, s6) \
|
|
MR_svar_label_layout_refs1(m, s7) \
|
|
MR_svar_label_layout_refs1(m, s8) \
|
|
MR_svar_label_layout_refs1(m, s9) \
|
|
MR_svar_label_layout_refs1(m, s10)
|
|
|
|
#define MR_lvar_label_layout_refs1(m, s1) \
|
|
&MR_lvar_label_layouts(m)[s1],
|
|
|
|
#define MR_lvar_label_layout_refs2(m, s1, s2) \
|
|
MR_lvar_label_layout_refs1(m, s1) \
|
|
MR_lvar_label_layout_refs1(m, s2)
|
|
|
|
#define MR_lvar_label_layout_refs3(m, s1, s2, s3) \
|
|
MR_lvar_label_layout_refs1(m, s1) \
|
|
MR_lvar_label_layout_refs1(m, s2) \
|
|
MR_lvar_label_layout_refs1(m, s3)
|
|
|
|
#define MR_lvar_label_layout_refs4(m, s1, s2, s3, s4) \
|
|
MR_lvar_label_layout_refs1(m, s1) \
|
|
MR_lvar_label_layout_refs1(m, s2) \
|
|
MR_lvar_label_layout_refs1(m, s3) \
|
|
MR_lvar_label_layout_refs1(m, s4)
|
|
|
|
#define MR_lvar_label_layout_refs5(m, s1, s2, s3, s4, s5) \
|
|
MR_lvar_label_layout_refs1(m, s1) \
|
|
MR_lvar_label_layout_refs1(m, s2) \
|
|
MR_lvar_label_layout_refs1(m, s3) \
|
|
MR_lvar_label_layout_refs1(m, s4) \
|
|
MR_lvar_label_layout_refs1(m, s5)
|
|
|
|
#define MR_lvar_label_layout_refs6(m, s1, s2, s3, s4, s5, s6) \
|
|
MR_lvar_label_layout_refs1(m, s1) \
|
|
MR_lvar_label_layout_refs1(m, s2) \
|
|
MR_lvar_label_layout_refs1(m, s3) \
|
|
MR_lvar_label_layout_refs1(m, s4) \
|
|
MR_lvar_label_layout_refs1(m, s5) \
|
|
MR_lvar_label_layout_refs1(m, s6)
|
|
|
|
#define MR_lvar_label_layout_refs7(m, s1, s2, s3, s4, s5, s6, s7) \
|
|
MR_lvar_label_layout_refs1(m, s1) \
|
|
MR_lvar_label_layout_refs1(m, s2) \
|
|
MR_lvar_label_layout_refs1(m, s3) \
|
|
MR_lvar_label_layout_refs1(m, s4) \
|
|
MR_lvar_label_layout_refs1(m, s5) \
|
|
MR_lvar_label_layout_refs1(m, s6) \
|
|
MR_lvar_label_layout_refs1(m, s7)
|
|
|
|
#define MR_lvar_label_layout_refs8(m, s1, s2, s3, s4, s5, s6, s7, s8) \
|
|
MR_lvar_label_layout_refs1(m, s1) \
|
|
MR_lvar_label_layout_refs1(m, s2) \
|
|
MR_lvar_label_layout_refs1(m, s3) \
|
|
MR_lvar_label_layout_refs1(m, s4) \
|
|
MR_lvar_label_layout_refs1(m, s5) \
|
|
MR_lvar_label_layout_refs1(m, s6) \
|
|
MR_lvar_label_layout_refs1(m, s7) \
|
|
MR_lvar_label_layout_refs1(m, s8)
|
|
|
|
#define MR_lvar_label_layout_refs9(m, s1, s2, s3, s4, s5, s6, s7, s8, s9) \
|
|
MR_lvar_label_layout_refs1(m, s1) \
|
|
MR_lvar_label_layout_refs1(m, s2) \
|
|
MR_lvar_label_layout_refs1(m, s3) \
|
|
MR_lvar_label_layout_refs1(m, s4) \
|
|
MR_lvar_label_layout_refs1(m, s5) \
|
|
MR_lvar_label_layout_refs1(m, s6) \
|
|
MR_lvar_label_layout_refs1(m, s7) \
|
|
MR_lvar_label_layout_refs1(m, s8) \
|
|
MR_lvar_label_layout_refs1(m, s9)
|
|
|
|
#define MR_lvar_label_layout_refs10(m, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10) \
|
|
MR_lvar_label_layout_refs1(m, s1) \
|
|
MR_lvar_label_layout_refs1(m, s2) \
|
|
MR_lvar_label_layout_refs1(m, s3) \
|
|
MR_lvar_label_layout_refs1(m, s4) \
|
|
MR_lvar_label_layout_refs1(m, s5) \
|
|
MR_lvar_label_layout_refs1(m, s6) \
|
|
MR_lvar_label_layout_refs1(m, s7) \
|
|
MR_lvar_label_layout_refs1(m, s8) \
|
|
MR_lvar_label_layout_refs1(m, s9) \
|
|
MR_lvar_label_layout_refs1(m, s10)
|
|
|
|
#endif /* not MERCURY_MISC_H */
|