mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-16 18:03:36 +00:00
Estimated hours taken: 30
Branches: main
Give the Mercury debugger the ability to detect cliques of mutually recursive
predicates on the stack. Exploit this ability to enhance the debugger's
level, retry, finish and stack commands.
runtime/mercury_stack_trace.[ch]:
Add a function, MR_find_clique_entry, that detects the clique
that contains the top stack frame. This is used to implement the new
arguments "clentry" and "clparent" (short for clique entry and parent)
options of the level, retry and finish commands. "clique" is a synonym
for "clentry" in these commands.
Add a function, MR_dump_stack_layout_clique, that implements the
new capabilities of the stack command. It can detect more than one
clique, anywhere on the stack.
To make this possible, modify the existing functions for printing
the lines of stack traces. These used to keep some information around
between calls in global variables. Now that information is stored in
two structures that the caller passes them. One contains the parameters
that govern what is to be printed, the other contains information about
what has been buffered up to be printed, but has not been flushed yet.
(The old code was confused in its handling of parameters. Some parts
of it looked up the global variables storing them, while other parts
were given the parameter values by their callers, values that could
have been -but weren't- inconsistent.)
Change the buffer flushing code to be idempotent, since in the new
code, sometimes it is hard to avoid flushing the buffer more than once,
and we want only the first to print its contents.
Make some type names conform to our standard style.
runtime/mercury_stack_layout.h:
Add a new flag in MR_ProcLayouts: a flag that indicates that the
procedure has one or more higher order arguments. The new code in
mercury_stack_trace.c handles procedures with this flag specially:
it does not consider two non-consecutive occurrences of such procedures
on the stack to be necessarily part of the same clique. This is to
avoid having two calls to e.g. list.map in different part of the
program pulling all the procedures between those parts on the stack
into a single clique. (The deep profiler has a very similar tweak.)
Add a pointer to the corresponding part of the compiler.
compiler/hlds_pred.m:
Add a predicate to test whether a predicate has any higher order args.
compiler/stack_layout.m:
When computing the flag in proc layouts, call the new procedure in
hlds_pred.m to help figure it out.
trace/mercury_trace_cmd_backward.c:
Implement the new options of the "retry" command.
trace/mercury_trace_cmd_forward.c:
Implement the new options of the "finish" command.
trace/mercury_trace_cmd_browsing.c:
Implement the "new options of the "level" command.
Implement the new functionality of the "stack" command.
trace/mercury_trace_util.[ch]:
Add some code common to the implementations of the level, retry and
finish commands.
trace/mercury_trace_external.c:
Conform to the changes to the runtime.
doc/user_guide.texi:
Document the debugger's new capabilities.
NEWS:
Announce the debugger's new capabilities.
tests/debugger/mutrec.{m,inp,exp}:
A new test case to test the handling of the stack command
in the presence of cliques.
tests/debugger/mutrec_higher_order.{m,inp,exp}:
A new test case to test the handling of the stack command
in the presence of cliques and higher order predicates.
tests/debugger/Mmakefile:
Enable both new test cases.
716 lines
26 KiB
Plaintext
716 lines
26 KiB
Plaintext
#-----------------------------------------------------------------------------#
|
|
|
|
THIS_DIR = debugger
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
RETRY_PROGS = \
|
|
all_solutions \
|
|
browser_test \
|
|
chooser_tag_test \
|
|
io_tab_goto \
|
|
lambda_expr \
|
|
mdb_command_test \
|
|
queens \
|
|
retry \
|
|
scripts \
|
|
tabled_read \
|
|
tabled_read_unitize \
|
|
tabled_read_decl \
|
|
tailrec1
|
|
|
|
NONRETRY_PROGS = \
|
|
ambiguity \
|
|
breakpoints \
|
|
browse_pretty \
|
|
class_decl \
|
|
cmd_quote \
|
|
cond \
|
|
debugger_regs \
|
|
dice \
|
|
double_print \
|
|
exception_cmd \
|
|
exception_value \
|
|
exception_vars \
|
|
existential_type_classes \
|
|
exported_eqv_type \
|
|
fib \
|
|
field_names \
|
|
higher_order \
|
|
implied_instance \
|
|
interpreter \
|
|
label_layout \
|
|
lambdatest \
|
|
loopcheck \
|
|
lval_desc_array \
|
|
mdbrc_test \
|
|
multi_parameter \
|
|
mutrec \
|
|
mutrec_higher_order \
|
|
poly_io_retry \
|
|
poly_io_retry2 \
|
|
polymorphic_ground_term \
|
|
polymorphic_output \
|
|
print_goal \
|
|
print_io_actions \
|
|
print_table \
|
|
queens_rep \
|
|
resume_typeinfos \
|
|
save \
|
|
shell \
|
|
solver_test \
|
|
switch_on_unbounded \
|
|
synth_attr \
|
|
synth_attr_impure \
|
|
type_desc_test \
|
|
uci_index \
|
|
user_event \
|
|
user_event_2
|
|
|
|
# We currently don't pass this test.
|
|
# deeply_nested_typeinfo
|
|
# This test is currently not useful.
|
|
# output_term_dep
|
|
|
|
SENSITIVE_PROGS = \
|
|
completion \
|
|
nondet_stack
|
|
|
|
SHALLOW_PROGS = \
|
|
shallow \
|
|
user_event_shallow
|
|
|
|
INTERACTIVE_PROGS = \
|
|
interactive
|
|
|
|
# Since the `interactive' test case requires the use of shared libraries,
|
|
# this means it won't work properly if the static libraries are linked
|
|
# (as is done by tools/bootcheck and tools/lmc).
|
|
# So we only enable it if LINK_STATIC is not set.
|
|
#
|
|
# The value of LINK_STATIC is normally in set in ../Mmake.common. However,
|
|
# we include ./Mmake.common only later on in this file, because
|
|
# ../Mmake.commmon depends on the value of the TESTS make variable, and hence
|
|
# on the value of PROGS, part of which we are trying to compute here.
|
|
# We resolve this circularity by repeating the critical test of WORKSPACE from
|
|
# ../Mmake.common here,
|
|
|
|
ifneq ($(origin WORKSPACE),undefined)
|
|
LINK_STATIC = yes
|
|
endif
|
|
ifeq ($(origin LINK_STATIC),undefined)
|
|
LINK_STATIC = no
|
|
endif
|
|
|
|
ifneq ($(LINK_STATIC),no)
|
|
INTERACTIVE_PROGS :=
|
|
endif
|
|
|
|
# Declarative debugging grades don't support trace level shallow,
|
|
# so we execute the tests exercising shallow tracing only in grades
|
|
# other than .decldebug grades.
|
|
ifneq "$(findstring decldebug,$(GRADE))" ""
|
|
SHALLOW_PROGS :=
|
|
endif
|
|
|
|
# The sensitive tests are so named because they are sensitive to details
|
|
# of code generation. We therefore execute them only in a minimal set of
|
|
# grades that still ensures good test coverage. For example, the tests
|
|
# in trailing grades without debugging do not test anything that the tests in
|
|
# .debug.tr grades do not.
|
|
|
|
ifneq "$(findstring prof,$(GRADE))" ""
|
|
SENSITIVE_PROGS :=
|
|
endif
|
|
ifneq "$(findstring memprof,$(GRADE))" ""
|
|
SENSITIVE_PROGS :=
|
|
endif
|
|
ifeq "$(findstring debug,$(GRADE))" ""
|
|
ifneq "$(findstring tr,$(GRADE))" ""
|
|
SENSITIVE_PROGS :=
|
|
endif
|
|
endif
|
|
ifneq "$(findstring mm,$(GRADE))" ""
|
|
SENSITIVE_PROGS :=
|
|
endif
|
|
ifneq "$(findstring tsw,$(GRADE))" ""
|
|
SENSITIVE_PROGS :=
|
|
endif
|
|
ifneq "$(findstring tsc,$(GRADE))" ""
|
|
SENSITIVE_PROGS :=
|
|
endif
|
|
|
|
# The no_inline_builtins test only works if the library is
|
|
# built with execution tracing enabled. Adding a `.exp2' file
|
|
# to allow it to be run in other grades would mean that we
|
|
# wouldn't detect a regression which caused builtins not to
|
|
# be traced with `--no-inline-builtins'.
|
|
ifeq "$(findstring debug,$(GRADE))" "debug"
|
|
DEBUG_GRADE_PROGS = no_inline_builtins
|
|
else
|
|
DEBUG_GRADE_PROGS =
|
|
endif
|
|
|
|
# The uci test matches its expected output only if the grade supports
|
|
# enumerated types. Currently all grades do support enumerated types.
|
|
ENUM_PROGS = uci
|
|
|
|
# The tests term_size_words and term_size_cells are each meant to be used
|
|
# in their respective grades only.
|
|
ifneq "$(findstring .tsw,$(GRADE))" ""
|
|
TERM_SIZE_PROGS = term_size_words
|
|
else
|
|
ifneq "$(findstring .tsc,$(GRADE))" ""
|
|
TERM_SIZE_PROGS = term_size_cells
|
|
else
|
|
TERM_SIZE_PROGS =
|
|
endif
|
|
endif
|
|
|
|
# The mmos_print test is meant to be used in mmos grades only.
|
|
ifneq "$(findstring mmos,$(GRADE))" ""
|
|
MMOS_PROGS = mmos_print
|
|
else
|
|
MMOS_PROGS =
|
|
endif
|
|
|
|
ALL_RETRY_PROGS = $(RETRY_PROGS) $(INTERACTIVE_PROGS)
|
|
ALL_NONRETRY_PROGS = $(NONRETRY_PROGS) $(SENSITIVE_PROGS) \
|
|
$(SHALLOW_PROGS) $(DEBUG_GRADE_PROGS) $(ENUM_PROGS) \
|
|
$(TERM_SIZE_PROGS) $(MMOS_PROGS)
|
|
|
|
# Debugging doesn't yet don't work in MLDS grades (hl*, il*, csharp, java),
|
|
# or the Erlang grade,
|
|
# and the retry command doesn't and will not work in deep profiling
|
|
# grades (profdeep).
|
|
# Also base grades `jump' and `fast' cannot be used with
|
|
# stack layouts (which are required for tracing).
|
|
|
|
ifneq "$(findstring profdeep,$(GRADE))" ""
|
|
# Eventually, this should be DEBUGGER_PROGS0=$(ALL_NONRETRY_PROGS).
|
|
# However, the code that is required to switch off the profiling
|
|
# primitives in Mercury code invoked by the debugger (e.g. for
|
|
# browsing) has not yet been implemented.
|
|
DEBUGGER_PROGS0=
|
|
else
|
|
DEBUGGER_PROGS0=$(ALL_NONRETRY_PROGS) $(ALL_RETRY_PROGS)
|
|
endif
|
|
|
|
# The tail call optimisation isn't supported in decldebug grades,
|
|
# so we don't run the tailrec1 test in those grades.
|
|
ifneq "$(findstring decldebug,$(GRADE))" ""
|
|
DEBUGGER_PROGS=$(subst tailrec1,,$(DEBUGGER_PROGS0))
|
|
else
|
|
DEBUGGER_PROGS=$(DEBUGGER_PROGS0)
|
|
endif
|
|
|
|
ifneq "$(filter hl% java% csharp% il% erlang%,$(GRADE))" ""
|
|
PROGS=
|
|
else
|
|
ifneq "$(findstring asm_,$(GRADE))" ""
|
|
PROGS=$(DEBUGGER_PROGS)
|
|
else
|
|
ifneq "$(findstring jump,$(GRADE))" ""
|
|
PROGS=
|
|
else
|
|
ifneq "$(findstring fast,$(GRADE))" ""
|
|
PROGS=
|
|
else
|
|
PROGS=$(DEBUGGER_PROGS)
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
SUBDIRS = declarative
|
|
TESTS = $(sort $(PROGS))
|
|
TESTS_DIR = ..
|
|
include $(TESTS_DIR)/Mmake.common
|
|
|
|
# The minimum trace level in .decldebug grades is --trace decl.
|
|
ifneq "$(findstring decldebug,$(GRADE))" ""
|
|
MCFLAGS += --trace decl
|
|
else
|
|
MCFLAGS += --trace deep
|
|
endif
|
|
MLFLAGS += --trace
|
|
|
|
# Some of the test cases require a different input in decldebug grades,
|
|
# so we set INP to the appropriate extension to use for those tests.
|
|
# All other tests ignore this variable.
|
|
#
|
|
ifneq "$(findstring .decldebug,$(GRADE))" ""
|
|
INP=inp2
|
|
else
|
|
INP=inp
|
|
endif
|
|
|
|
# Module-specific options should go in Mercury.options so they
|
|
# can be found by `mmc --make'.
|
|
include Mercury.options
|
|
|
|
%.runtest: %.res ;
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
ambiguity.out: ambiguity ambiguity.inp
|
|
$(MDB_STD) ./ambiguity < ambiguity.inp > ambiguity.out 2>&1
|
|
|
|
all_solutions.out: all_solutions all_solutions.inp
|
|
$(MDB) ./all_solutions < all_solutions.inp > all_solutions.out 2>&1
|
|
|
|
breakpoints.out: breakpoints breakpoints.inp
|
|
$(MDB_STD) ./breakpoints < breakpoints.inp > breakpoints.out 2>&1
|
|
|
|
# We need to pipe the output through sed to avoid hard-coding dependencies on
|
|
# particular line numbers in the standard library source code.
|
|
browse_pretty.out: browse_pretty browse_pretty.inp
|
|
$(MDB) ./browse_pretty < browse_pretty.inp 2>&1 | \
|
|
sed 's/io.m:[0-9]*/io.m:NNNN/g' > browse_pretty.out 2>&1
|
|
|
|
# We need to pipe the output through sed to avoid hard-coding dependencies on
|
|
# particular line numbers in the standard library source code.
|
|
browser_test.out: browser_test browser_test.inp
|
|
$(MDB_STD) ./browser_test < browser_test.inp 2>&1 | \
|
|
sed 's/io.m:[0-9]*/io.m:NNNN/g' > browser_test.out 2>&1
|
|
|
|
# We need to pipe the output through sed to avoid hard-coding dependencies on
|
|
# particular line numbers in the standard library source code.
|
|
class_decl.out: class_decl class_decl.inp
|
|
$(MDB) ./class_decl < class_decl.inp 2>&1 | \
|
|
sed 's/io.m:[0-9]*/io.m:NNNN/g' > class_decl.out 2>&1
|
|
|
|
# We need to pipe the output through sed to avoid hard-coding dependencies on
|
|
# particular line numbers in the standard library source code.
|
|
cmd_quote.out: cmd_quote cmd_quote.inp
|
|
$(MDB) ./cmd_quote < cmd_quote.inp 2>&1 | \
|
|
sed 's/io.m:[0-9]*/io.m:NNNN/g' > cmd_quote.out 2>&1
|
|
|
|
cond.out: cond cond.inp
|
|
$(MDB_STD) ./cond < cond.inp > cond.out 2>&1
|
|
|
|
chooser_tag_test.out: chooser_tag_test chooser_tag_test.inp
|
|
$(MDB_STD) ./chooser_tag_test < chooser_tag_test.inp \
|
|
> chooser_tag_test.out 2>&1
|
|
|
|
# Set up readline to make it easier to use completion non-interactively.
|
|
completion.out: completion completion.inp
|
|
INPUTRC=completion.inputrc $(MDB) ./completion \
|
|
< completion.inp 2>&1 | sed -e '/^$$/d' > completion.out 2>&1
|
|
|
|
debugger_regs.out: debugger_regs debugger_regs.inp
|
|
$(MDB) ./debugger_regs < debugger_regs.inp > debugger_regs.out 2>&1
|
|
|
|
deeply_nested_typeinfo.out: deeply_nested_typeinfo deeply_nested_typeinfo.inp
|
|
$(MDB_STD) ./deeply_nested_typeinfo < deeply_nested_typeinfo.inp \
|
|
> deeply_nested_typeinfo.out 2>&1
|
|
|
|
double_print.out: double_print double_print.inp
|
|
$(MDB_STD) ./double_print < double_print.inp > double_print.out 2>&1
|
|
|
|
poly_io_retry.out: poly_io_retry poly_io_retry.inp
|
|
$(MDB_STD) ./poly_io_retry < poly_io_retry.inp \
|
|
> poly_io_retry.out 2>&1
|
|
|
|
poly_io_retry2.out: poly_io_retry2 poly_io_retry2.inp
|
|
$(MDB_STD) ./poly_io_retry2 < poly_io_retry2.inp \
|
|
> poly_io_retry2.out 2>&1
|
|
|
|
# The exception_cmd, exception_vars and loopcheck tests
|
|
# are supposed to return a non-zero exit status, since they exit by throwing
|
|
# an exception. We strip the goal paths from their exception events, since
|
|
# the exact goal paths are dependent on optimization level. The stripping
|
|
# must be done outside the condition of the if-then-else.
|
|
exception_cmd.out: exception_cmd exception_cmd.inp
|
|
if $(MDB_STD) ./exception_cmd < exception_cmd.inp \
|
|
> exception_cmd.tmp 2>&1; \
|
|
then \
|
|
sed -e '/EXCP/s/).*/)/' < exception_cmd.tmp \
|
|
> exception_cmd.out 2>&1; \
|
|
rm exception_cmd.tmp; \
|
|
false; \
|
|
else \
|
|
sed -e '/EXCP/s/).*/)/' < exception_cmd.tmp \
|
|
> exception_cmd.out 2>&1; \
|
|
rm exception_cmd.tmp; \
|
|
true; \
|
|
fi
|
|
|
|
dice.pass1: dice
|
|
/bin/rm -f .mercury_trace_counts.*dice.*
|
|
MERCURY_OPTIONS=--trace-count ./dice 1 2 3 4 && \
|
|
mv .mercury_trace_counts.*dice.* dice.pass1
|
|
|
|
dice.pass2: dice
|
|
/bin/rm -f .mercury_trace_counts.*dice.*
|
|
MERCURY_OPTIONS=--trace-count ./dice 5 6 7 8 && \
|
|
mv .mercury_trace_counts.*dice.* dice.pass2
|
|
|
|
dice.pass3: dice
|
|
/bin/rm -f .mercury_trace_counts.*dice.*
|
|
MERCURY_OPTIONS=--trace-count ./dice 10 11 100 && \
|
|
mv .mercury_trace_counts.*dice.* dice.pass3
|
|
|
|
dice.passes: dice.pass1 dice.pass2 dice.pass3
|
|
MERCURY_OPTIONS= \
|
|
$(SLICE_DIR)mtc_union -o dice.passes dice.pass1 dice.pass2 dice.pass3
|
|
|
|
dice.fail: dice
|
|
/bin/rm -f .mercury_trace_counts.*dice.*
|
|
MERCURY_OPTIONS=--trace-count ./dice 4 1 2 3 && \
|
|
mv .mercury_trace_counts.*dice.* dice.fail
|
|
|
|
dice.out: dice dice.inp dice.passes dice.fail
|
|
$(MDB_STD) ./dice 4 1 2 3 < dice.inp > dice.out 2>&1
|
|
|
|
# We need to pipe the output through sed to avoid hard-coding dependencies on
|
|
# particular line numbers in the standard library source code.
|
|
exception_value.out: exception_value exception_value.inp
|
|
$(MDB_STD) ./exception_value < exception_value.inp 2>&1 | \
|
|
sed -e 's/exception.m:[0-9]*/exception.m:NNNN/g' | \
|
|
sed -e '/EXCP/s/).*/)/' > exception_value.out 2>&1
|
|
|
|
exception_vars.out: exception_vars exception_vars.inp
|
|
if $(MDB_STD) ./exception_vars < exception_vars.inp \
|
|
> exception_vars.tmp 2>&1; \
|
|
then \
|
|
sed -e '/EXCP/s/).*/)/' < exception_vars.tmp \
|
|
> exception_vars.out 2>&1; \
|
|
rm exception_vars.tmp; \
|
|
false; \
|
|
else \
|
|
sed -e '/EXCP/s/).*/)/' < exception_vars.tmp \
|
|
> exception_vars.out 2>&1; \
|
|
rm exception_vars.tmp; \
|
|
true; \
|
|
fi
|
|
|
|
# We need to pipe the output through sed to avoid hard-coding dependencies on
|
|
# particular line numbers in the standard library source code.
|
|
existential_type_classes.out: existential_type_classes \
|
|
existential_type_classes.inp
|
|
$(MDB_STD) ./existential_type_classes < existential_type_classes.inp \
|
|
2>&1 | sed 's/string.m:[0-9]*/string.m:NNNN/g' | \
|
|
sed 's/int.m:[0-9]*/int.m:NNNN/g' | \
|
|
sed 's/existential_type_classes.m:[0-9]*/existential_type_classes.m:NNNN/g' | \
|
|
sed 's/c_pointer(0x[0-9A-Fa-f]*)/c_pointer(0xXXXX)/g' \
|
|
> existential_type_classes.out
|
|
|
|
exported_eqv_type.out: exported_eqv_type exported_eqv_type.inp
|
|
$(MDB_STD) ./exported_eqv_type < exported_eqv_type.inp > exported_eqv_type.out 2>&1
|
|
|
|
fib.out: fib fib.inp
|
|
$(MDB_STD) ./fib < fib.inp > fib.out 2>&1
|
|
|
|
field_names.out: field_names field_names.inp
|
|
$(MDB) ./field_names < field_names.inp > field_names.out 2>&1
|
|
|
|
higher_order.out: higher_order higher_order.inp
|
|
$(MDB_STD) ./higher_order < higher_order.inp > higher_order.out 2>&1
|
|
|
|
implied_instance.out: implied_instance implied_instance.inp
|
|
$(MDB) ./implied_instance < implied_instance.inp \
|
|
> implied_instance.out 2>&1
|
|
|
|
io_tab_goto.out: io_tab_goto io_tab_goto.inp
|
|
$(MDB_STD) ./io_tab_goto < io_tab_goto.inp 2>&1 | \
|
|
sed 's/c_pointer(0x[0-9A-Fa-f]*)/c_pointer(0xXXXX)/g' \
|
|
> io_tab_goto.out 2>&1
|
|
|
|
lambda_expr.out: lambda_expr lambda_expr.inp
|
|
$(MDB_STD) ./lambda_expr < lambda_expr.inp > lambda_expr.out 2>&1
|
|
|
|
label_layout.out: label_layout label_layout.inp
|
|
$(MDB) ./label_layout < label_layout.inp > label_layout.out 2>&1
|
|
|
|
lambdatest.out: lambdatest lambdatest.inp
|
|
$(MDB_STD) ./lambdatest < lambdatest.inp > lambdatest.out 2>&1
|
|
|
|
loopcheck.out: loopcheck loopcheck.$(INP)
|
|
if $(MDB) ./loopcheck < loopcheck.$(INP) \
|
|
> loopcheck.tmp 2>&1; \
|
|
then \
|
|
sed -e '/EXCP/s/).*/)/' \
|
|
-e 's/require.m:[0-9]*/require.m:NNNN/g' \
|
|
-e 's/label with no stack layout info/unknown label/' \
|
|
< loopcheck.tmp > loopcheck.out 2>&1; \
|
|
rm loopcheck.tmp; \
|
|
false; \
|
|
else \
|
|
sed -e '/EXCP/s/).*/)/' \
|
|
-e 's/require.m:[0-9]*/require.m:NNNN/g' \
|
|
< loopcheck.tmp > loopcheck.out 2>&1; \
|
|
rm loopcheck.tmp; \
|
|
true; \
|
|
fi
|
|
|
|
interpreter.out: interpreter interpreter.inp
|
|
$(MDB_STD) ./interpreter interpreter.m < interpreter.inp \
|
|
> interpreter.out 2>&1
|
|
|
|
lval_desc_array.out: lval_desc_array lval_desc_array.inp
|
|
$(MDB) ./lval_desc_array < lval_desc_array.inp \
|
|
> lval_desc_array.out 2>&1
|
|
|
|
# The use of MDB_STD_NOINIT here is to override the default mdbrc file
|
|
# specified by the MDB make variable.
|
|
mdbrc_test.out: mdbrc_test mdbrc_test.inp mdbrc_test.mdbrc
|
|
cp mdbrc_test.mdbrc .mdbrc
|
|
$(MDB_STD_NOINIT) ./mdbrc_test < mdbrc_test.inp \
|
|
> mdbrc_test.out 2>&1
|
|
/bin/rm .mdbrc
|
|
|
|
# We need to pipe the output through sed to avoid hard-coding dependencies on
|
|
# particular line numbers in the standard library source code.
|
|
multi_parameter.out: multi_parameter multi_parameter.inp
|
|
$(MDB) ./multi_parameter < multi_parameter.inp 2>&1 | \
|
|
sed 's/char.m:[0-9]*/char.m:NNNN/g' > multi_parameter.out
|
|
|
|
no_inline_builtins.out: no_inline_builtins no_inline_builtins.inp
|
|
$(MDB) ./no_inline_builtins < no_inline_builtins.inp \
|
|
> no_inline_builtins.out 2>&1
|
|
|
|
mmos_print.out: mmos_print mmos_print.inp
|
|
$(MDB) ./mmos_print < mmos_print.inp \
|
|
> mmos_print.out 2>&1
|
|
|
|
mmos_print.out: mmos_print mmos_print.inp
|
|
$(MDB) ./mmos_print < mmos_print.inp \
|
|
> mmos_print.out 2>&1
|
|
|
|
mutrec.out: mutrec mutrec.inp
|
|
$(MDB) ./mutrec < mutrec.inp > mutrec.out 2>&1
|
|
|
|
mutrec_higher_order.out: mutrec_higher_order mutrec_higher_order.inp
|
|
$(MDB_STD) ./mutrec_higher_order < mutrec_higher_order.inp \
|
|
> mutrec_higher_order.out 2>&1
|
|
|
|
# We need to pipe the output through sed to avoid hard-coding dependencies on
|
|
# particular line numbers in the standard library source code.
|
|
output_term_dep.out: output_term_dep output_term_dep.inp
|
|
$(MDB) ./output_term_dep < output_term_dep.inp 2>&1 | \
|
|
sed 's/io.m:[0-9]*/io.m:NNNN/g' > output_term_dep.out 2>&1
|
|
|
|
polymorphic_ground_term.out: polymorphic_ground_term polymorphic_ground_term.inp
|
|
$(MDB_STD) ./polymorphic_ground_term < polymorphic_ground_term.inp \
|
|
> polymorphic_ground_term.out 2>&1;
|
|
|
|
polymorphic_output.out: polymorphic_output polymorphic_output.inp
|
|
$(MDB_STD) ./polymorphic_output < polymorphic_output.inp \
|
|
> polymorphic_output.out 2>&1;
|
|
|
|
print_goal.out: print_goal print_goal.inp
|
|
$(MDB_STD) ./print_goal < print_goal.inp > print_goal.out 2>&1
|
|
|
|
print_io_actions.out: print_io_actions print_io_actions.inp \
|
|
print_io_actions.data
|
|
$(MDB_STD) ./print_io_actions < print_io_actions.inp | \
|
|
sed 's/c_pointer(0x[0-9A-Fa-f]*)/c_pointer(0xXXXX)/g' \
|
|
> print_io_actions.out 2>&1
|
|
|
|
print_table.out: print_table print_table.inp
|
|
$(MDB_STD) ./print_table < print_table.inp > print_table.out 2>&1
|
|
|
|
queens.out: queens queens.inp
|
|
$(MDB_STD) ./queens < queens.inp 2>&1 | \
|
|
sed 's/int.m:[0-9]*/int.m:NNNN/g' > queens.out 2>&1
|
|
|
|
queens_rep.out: queens_rep queens_rep.inp
|
|
$(MDB) ./queens_rep < queens_rep.inp > queens_rep.out 2>&1
|
|
|
|
# We insert the names of entry labels into the label table only in a few grades
|
|
# (e.g. profiling grades). The debugger's redo label is an entry label. To
|
|
# avoid spurious inconsistencies in the output, we filter out its name even
|
|
# when known.
|
|
nondet_stack.out: nondet_stack nondet_stack.inp
|
|
$(MDB_STD) ./nondet_stack < nondet_stack.inp 2>&1 | \
|
|
sed 's/entry label MR_do_trace_redo_fail_deep/label UNKNOWN/g' \
|
|
| sed 's/unnamed label 0x.*/unnamed label/' \
|
|
| sed 's/unnamed entry label 0x.*/unnamed entry label/' \
|
|
| sed 's/label UNKNOWN .*/label UNKNOWN/' \
|
|
| sed 's/nondet_stack.m:[0-9]*/nondet_stack.m:NNNN/g' \
|
|
> nondet_stack.out 2>&1
|
|
|
|
resume_typeinfos.out: resume_typeinfos resume_typeinfos.inp
|
|
$(MDB_STD) ./resume_typeinfos < resume_typeinfos.inp 2>&1 | \
|
|
sed 's/resume_typeinfos.m:[0-9]*/resume_typeinfos.m:NNNN/g' \
|
|
> resume_typeinfos.out 2>&1
|
|
|
|
retry.out: retry retry.inp
|
|
$(MDB_STD) ./retry < retry.inp > retry.out 2>&1
|
|
|
|
# The values of xml_browser_cmd and xml_tmp_filename will be system specific,
|
|
# so we pipe the output through sed and replace the system specific bit
|
|
# with a known character sequence.
|
|
save.out: save save.inp
|
|
$(MDB) ./save < save.inp 2>&1 | \
|
|
sed 's/xml_browser_cmd.*/xml_browser_cmd ZZZ/g' | \
|
|
sed 's/xml_tmp_filename.*/xml_tmp_filename ZZZ/g' | \
|
|
sed 's/^alias grep source.*$$/alias grep source ZZZ\/mdb_grep/' | \
|
|
sed 's/^alias open source.*$$/alias open source ZZZ\/mdb_open/' | \
|
|
sed 's/^alias track source.*$$/alias track source ZZZ\/mdb_track/'\
|
|
> save.out 2>&1
|
|
|
|
scripts.out: scripts scripts.inp
|
|
EDITOR=cat $(MDB_STD) ./scripts < scripts.inp > scripts.out 2>&1
|
|
|
|
shallow.out: shallow shallow.inp
|
|
$(MDB) ./shallow < shallow.inp > shallow.out 2>&1
|
|
|
|
shell.out: shell shell.inp
|
|
$(MDB_STD) ./shell < shell.inp > shell.out 2>&1
|
|
|
|
solver_test.out: solver_test solver_test.inp
|
|
$(MDB_STD) ./solver_test < solver_test.inp > solver_test.out 2>&1
|
|
|
|
switch_on_unbounded.out: switch_on_unbounded switch_on_unbounded.inp
|
|
$(MDB_STD) ./switch_on_unbounded < switch_on_unbounded.inp \
|
|
> switch_on_unbounded.out 2>&1
|
|
|
|
tabled_read.out: tabled_read tabled_read.inp tabled_read.data
|
|
$(MDB_STD) ./tabled_read < tabled_read.inp 2>&1 | \
|
|
sed 's/c_pointer(0x[0-9A-Fa-f]*)/c_pointer(0xXXXX)/g' \
|
|
> tabled_read.out 2>&1
|
|
|
|
tabled_read_unitize.out: tabled_read_unitize.data
|
|
|
|
tabled_read_unitize.out: tabled_read_unitize tabled_read_unitize.inp
|
|
$(MDB_STD) ./tabled_read_unitize < tabled_read_unitize.inp \
|
|
> tabled_read_unitize.out 2>&1
|
|
|
|
tabled_read_decl.out: tabled_read_decl tabled_read_decl.inp tabled_read_decl.data
|
|
$(MDB_STD) ./tabled_read_decl < tabled_read_decl.inp 2>&1 | \
|
|
sed 's/c_pointer(0x[0-9A-Fa-f]*)/c_pointer(0xXXXX)/g' \
|
|
> tabled_read_decl.out 2>&1
|
|
|
|
tailrec1.out: tailrec1 tailrec1.inp tailrec1.data
|
|
$(MDB_STD) ./tailrec1 < tailrec1.inp > tailrec1.out 2>&1
|
|
|
|
term_size_cells.out: term_size_cells term_size_cells.inp
|
|
$(MDB_STD) ./term_size_cells < term_size_cells.inp \
|
|
> term_size_cells.out 2>&1
|
|
|
|
term_size_words.out: term_size_words term_size_words.inp
|
|
$(MDB_STD) ./term_size_words < term_size_words.inp \
|
|
> term_size_words.out 2>&1
|
|
|
|
type_desc_test.out: type_desc_test type_desc_test.inp
|
|
$(MDB_STD) ./type_desc_test < type_desc_test.inp \
|
|
> type_desc_test.out 2>&1
|
|
|
|
uci.out: uci uci.inp
|
|
$(MDB_STD) ./uci < uci.inp > uci.out 2>&1
|
|
|
|
uci_index.out: uci_index uci_index.inp
|
|
$(MDB_STD) ./uci_index < uci_index.inp > uci_index.out 2>&1
|
|
|
|
synth_attr.out: synth_attr synth_attr.inp synth_attr_spec
|
|
$(MDB_STD) ./synth_attr < synth_attr.inp > synth_attr.out 2>&1
|
|
|
|
synth_attr_impure.out: synth_attr_impure synth_attr_impure.inp \
|
|
synth_attr_impure_spec
|
|
$(MDB_STD) ./synth_attr_impure < synth_attr_impure.inp \
|
|
> synth_attr_impure.out 2>&1
|
|
|
|
user_event.out: user_event user_event.inp user_event_spec
|
|
$(MDB_STD) ./user_event < user_event.inp 2>&1 > user_event.out 2>&1
|
|
|
|
user_event_2.out: user_event_2 user_event_2.inp user_event_spec_2
|
|
$(MDB_STD) ./user_event_2 < user_event_2.inp \
|
|
> user_event_2.out 2>&1
|
|
|
|
user_event_shallow.out: user_event_shallow user_event_shallow.inp \
|
|
user_event_spec
|
|
$(MDB_STD) ./user_event_shallow < user_event_shallow.inp \
|
|
> user_event_shallow.out 2>&1
|
|
|
|
# When WORKSPACE is set, use $(WORKSPACE)/tools/lmc to compile the query.
|
|
ifneq ($(origin WORKSPACE), undefined)
|
|
export WORKSPACE
|
|
endif
|
|
|
|
# Note that interactive.out.orig depends on $(interactive.ints) because
|
|
# interactive.inp contains interactive queries that require interactive.ints
|
|
# to have been built.
|
|
interactive.out.orig: interactive interactive.ints
|
|
ifneq ($(origin WORKSPACE),undefined)
|
|
rm -rf lmc
|
|
mkdir ./lmc
|
|
cp $(WORKSPACE)/tools/lmc lmc/mmc
|
|
endif
|
|
echo "echo on" > interactive.inp.tmp
|
|
echo mmc_options $(ALL_GRADEFLAGS) $(ALL_MCFLAGS) \
|
|
--trace minimum >> interactive.inp.tmp
|
|
cat interactive.inp >> interactive.inp.tmp
|
|
PATH="`pwd`/lmc:$$PATH" $(MDB) ./interactive \
|
|
< interactive.inp.tmp > interactive.out.orig 2>&1
|
|
rm -f interactive.inp.tmp
|
|
rm -rf lmc
|
|
|
|
# We pipe the output through sed to avoid differences for `--use-subdirs',
|
|
# and to remove some spurious warnings that `gcc' and `ld' issue.
|
|
# XXX we should fix the spurious warnings about unresolved symbols.
|
|
# (The spurious warnings about exception handling are due to a flaw
|
|
# in the Digital Unix 3.2 linker, so that one is DEC's problem.)
|
|
interactive.out: interactive.out.orig
|
|
cat interactive.out.orig | \
|
|
sed \
|
|
-e '/mdb> mmc_options/d' \
|
|
-e '/In file included from .*\/lib\/mercury\/inc\/mercury_trace_base.h:[0-9]*,$$/N' \
|
|
-e 's/In file included from .*\/lib\/mercury\/inc\/mercury_trace_base.h:[0-9]*,.//' \
|
|
-e '/ from .*\/lib\/mercury\/inc\/mercury_wrapper.h:[0-9]*,$$/N' \
|
|
-e 's/ from .*\/lib\/mercury\/inc\/mercury_wrapper.h:[0-9]*,.//' \
|
|
-e '/ from .*\/lib\/mercury\/inc\/mercury_imp.h:[0-9]*,$$/N' \
|
|
-e 's/ from .*\/lib\/mercury\/inc\/mercury_imp.h:[0-9]*,.//' \
|
|
-e '/ from mdb_query.c:[0-9]*:$$/N' \
|
|
-e 's/ from mdb_query.c:[0-9]*:.//' \
|
|
-e '/\/usr\/local\/apps\/gcc-2.95.3\/lib\/gcc-lib\/alpha-dec-osf5.1\/2.95.3\/include\/unistd.h:[0-9]*: warning: .cuserid. redefined$$/N' \
|
|
-e 's/\/usr\/local\/apps\/gcc-2.95.3\/lib\/gcc-lib\/alpha-dec-osf5.1\/2.95.3\/include\/unistd.h:[0-9]*: warning: .cuserid. redefined.//' \
|
|
-e '/\/usr\/local\/apps\/gcc-2.95.3\/lib\/gcc-lib\/alpha-dec-osf5.1\/2.95.3\/include\/stdio.h:[0-9]*: warning: this is the location of the previous definition$$/N' \
|
|
-e 's/\/usr\/local\/apps\/gcc-2.95.3\/lib\/gcc-lib\/alpha-dec-osf5.1\/2.95.3\/include\/stdio.h:[0-9]*: warning: this is the location of the previous definition.//' \
|
|
-e '/In file included from \/usr\/local\/apps\/gcc-2.95.3\/lib\/gcc-lib\/alpha-dec-osf5.1\/2.95.3\/include\/stdarg.h:[0-9]*,$$/N' \
|
|
-e 's/In file included from \/usr\/local\/apps\/gcc-2.95.3\/lib\/gcc-lib\/alpha-dec-osf5.1\/2.95.3\/include\/stdarg.h:[0-9]*,.//' \
|
|
-e '/ from .*\/lib\/mercury\/inc\/mercury_library_types.h:[0-9]*,$$/N' \
|
|
-e 's/ from .*\/lib\/mercury\/inc\/mercury_library_types.h:[0-9]*,.//' \
|
|
-e '/ from .*\/lib\/mercury\/inc\/mercury_imp.h:[0-9]*,$$/N' \
|
|
-e 's/ from .*\/lib\/mercury\/inc\/mercury_imp.h:[0-9]*,.//' \
|
|
-e '/ from mdb_query.c:[0-9]*:$$/N' \
|
|
-e 's/ from mdb_query.c:[0-9]*:.//' \
|
|
-e '/\/usr\/local\/apps\/gcc-2.95.3\/lib\/gcc-lib\/alpha-dec-osf5.1\/2.95.3\/include\/va-alpha.h:[0-9]*: warning: redefinition of .va_list.$$/N' \
|
|
-e 's/\/usr\/local\/apps\/gcc-2.95.3\/lib\/gcc-lib\/alpha-dec-osf5.1\/2.95.3\/include\/va-alpha.h:[0-9]*: warning: redefinition of .va_list..//' \
|
|
-e '/\/usr\/local\/apps\/gcc-2.95.3\/lib\/gcc-lib\/alpha-dec-osf5.1\/2.95.3\/include\/va_list.h:[0-9]*: warning: .va_list. previously declared here$$/N' \
|
|
-e 's/\/usr\/local\/apps\/gcc-2.95.3\/lib\/gcc-lib\/alpha-dec-osf5.1\/2.95.3\/include\/va_list.h:[0-9]*: warning: .va_list. previously declared here.//' \
|
|
-e '/\/usr\/bin\/ld:$$/N' \
|
|
-e 's/\/usr\/bin\/ld:.//' \
|
|
-e '/\/bin\/ld:$$/N' \
|
|
-e 's/\/bin\/ld:.//' \
|
|
-e '/Warning: Linking some objects which contain exception information sections$$/N' \
|
|
-e 's/Warning: Linking some objects which contain exception information sections.//' \
|
|
-e '/ and some which do not. This may cause fatal runtime exception handling$$/N' \
|
|
-e 's/ and some which do not. This may cause fatal runtime exception handling.//' \
|
|
-e '/ problems (last obj encountered without exceptions was .*)\.$$/N' \
|
|
-e 's/ problems (last obj encountered without exceptions was .*)\..//' \
|
|
-e '/Warning: Unresolved:$$/N' \
|
|
-e 's/Warning: Unresolved:.//' \
|
|
-e '/<predicate .main.\/2 mode 0>$$/N' \
|
|
-e 's/<predicate .main.\/2 mode 0>.//' \
|
|
-e '/<predicate .interactive:qperm.\/2 mode 0>$$/N' \
|
|
-e 's/<predicate .interactive:qperm.\/2 mode 0>.//' \
|
|
-e '/__start$$/N' \
|
|
-e 's/__start.//' \
|
|
> interactive.out
|
|
# ignore egcs internal errors -- those are not our fault
|
|
if grep 'gcc.*Internal compiler error' interactive.out; then \
|
|
cp interactive.exp interactive.out; \
|
|
fi
|
|
|
|
# We ignore the result of this action because
|
|
# the exit status of grep is not useful in this case
|
|
mdb_command_test.out: mdb_command_test mdb_command_test.inp
|
|
-$(MDB) ./mdb_command_test < mdb_command_test.inp 2>&1 \
|
|
| egrep "internal error in the trace help system" \
|
|
> mdb_command_test.out
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|