mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-14 13:23:53 +00:00
Estimated hours taken: 20
Branches: main
Add a mechanism for dynamically growing the trail by adding new segments to it
in a similar fashion to what we do for the stacks with stack segments. The
mechanism is enabled by the trseg (trail segments) grade component. Unlike
stack segments the trail segment mechanism also works with the high-level C
backend.
The mechanism works by adding a test to MR_trail_{value,function} that checks
if we are about to run out of a trail and allocates a new trail segment if
that test succeeds.
Extend mdb's trail_details command to print the current number of trail
segments in trseg grades.
Fix a bug where the MR_trail_ptr was not being reset correctly after
a trail reset.
runtime/mercury_grade.h:
Add the new grade component.
runtime/mercury_conf_param.h:
Document the new grade component, and the option used to debug
trail segments.
runtime/mercury_memory_zones.h:
Shift the definition MR_MemoryZones to this file in order break
a cyclic dependency between header files.
runtime/mercury_context.h:
Add a new field to the context structure to hold a list previous
trail segments.
Delete the definition of the type MR_MemoryZones from here.
runtime/mercury_trail.[ch]:
When adding a new trail entry in trseg grades first check whether we
need to extend the trail and do so if necessary.
Export the definitions of MR_TRAIL_{BASE,ZONE}.
Add a macro, MR_PREV_TRAIL_ZONES, for accessing the list of trail zones
in a grade independent manner.
Fix a typo in a comment.
Add functions for creating and destroying trail segments.
Handle trail segments in the code that handles untrailing and
resets. This also fixes a bug with trail reset where MR_trail_ptr
was not being reset along with the rest of the trail state.
compiler/options.m:
compiler/handle_options.m:
compiler/compile_target_code.m:
scripts/canonical_grade.sh-subr:
scripts/init_grade_option.sh-subr:
scripts/mgnuc.in:
scripts/parse_grade_options.sh-subr:
Handle the new grade component.
trace/mercury_trace_cmd_developer.c:
Make the trail_details command print out the number of trail segments
in trseg grades.
tests/trailing/Mmakefile:
tests/trailing/tr_reset_bug.{m,exp}:
Regression test for the bug with trail resets.
572 lines
16 KiB
Plaintext
572 lines
16 KiB
Plaintext
#---------------------------------------------------------------------------#
|
|
# vim: ts=4 sw=4 expandtab
|
|
#---------------------------------------------------------------------------#
|
|
# Copyright (C) 1997-2007 The University of Melbourne.
|
|
# This file may only be copied under the terms of the GNU General
|
|
# Public License - see the file COPYING in the Mercury distribution.
|
|
#---------------------------------------------------------------------------#
|
|
#
|
|
# parse_grade_options.sh-subr:
|
|
# An `sh' subroutine for parsing grade-related options.
|
|
# Used by the `ml', `mgnuc' and `c2init' scripts.
|
|
#
|
|
# The code here should be inserted in the case statement in a script's
|
|
# option-parsing loop.
|
|
#
|
|
# IMPORTANT: any changes to the handling of grades here may also require
|
|
# changes to all the files indicated by runtime/mercury_grade.h.
|
|
#
|
|
# This file should handle the setting of all the shell variables defined by
|
|
# init_grade_options.sh-subr.
|
|
#
|
|
#---------------------------------------------------------------------------#
|
|
|
|
--target)
|
|
shift
|
|
case "$1" in
|
|
asm)
|
|
target=asm ;;
|
|
c|C)
|
|
target=c ;;
|
|
il|IL)
|
|
target=il ;;
|
|
java|Java)
|
|
target=java ;;
|
|
erlang|Erlang)
|
|
target=erlang ;;
|
|
*)
|
|
echo "$0: invalid target \`$1'" 1>&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
--il|--IL|--il-only|--IL-only)
|
|
target=il ;;
|
|
|
|
--java|--Java|--java-only|--Java-only)
|
|
target=java ;;
|
|
|
|
--erlang|--Erlang|--erlang-only|--Erlang-only)
|
|
target=erlang ;;
|
|
|
|
--high-level-code|-H)
|
|
highlevel_code=true ;;
|
|
--no-high-level-code|-H-)
|
|
highlevel_code=false ;;
|
|
|
|
--high-level-data)
|
|
highlevel_data=true ;;
|
|
--no-high-level-data)
|
|
highlevel_data=false ;;
|
|
|
|
--gcc-nested-functions)
|
|
gcc_nested_functions=true ;;
|
|
--no-gcc-nested-functions)
|
|
gcc_nested_functions=false ;;
|
|
|
|
--asm-labels)
|
|
asm_labels=true ;;
|
|
--no-asm-labels)
|
|
asm_labels=false ;;
|
|
|
|
--gcc-non-local-gotos)
|
|
non_local_gotos=true ;;
|
|
--no-gcc-non-local-gotos)
|
|
non_local_gotos=false ;;
|
|
|
|
--gcc-global-registers)
|
|
global_regs=true ;;
|
|
--no-gcc-global-registers)
|
|
global_regs=false ;;
|
|
|
|
--gc)
|
|
shift
|
|
case "$1" in
|
|
accurate|conservative|boehm|boehm_debug|mps|none|automatic)
|
|
gc_method=$1 ;;
|
|
*)
|
|
echo "$0: invalid gc method \`$1'" 1>&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
--parallel)
|
|
thread_safe=true ;;
|
|
|
|
-p|--profiling|--time-profiling)
|
|
profile_time=true
|
|
profile_calls=true
|
|
profile_memory=false
|
|
profile_deep=false
|
|
;;
|
|
--memory-profiling)
|
|
profile_time=false
|
|
profile_calls=true
|
|
profile_memory=true
|
|
profile_deep=false
|
|
;;
|
|
--deep-profiling)
|
|
profile_time=false
|
|
profile_calls=false
|
|
profile_memory=false
|
|
profile_deep=true
|
|
;;
|
|
-p-|--no-profiling)
|
|
profile_time=false
|
|
profile_calls=false
|
|
profile_memory=false
|
|
profile_deep=false
|
|
;;
|
|
--profile-time)
|
|
profile_time=true ;;
|
|
--no-profile-time)
|
|
profile_time=false ;;
|
|
--profile-calls)
|
|
profile_calls=true ;;
|
|
--no-profile-calls)
|
|
profile_calls=false ;;
|
|
--profile-memory)
|
|
profile_memory=true ;;
|
|
--no-profile-memory)
|
|
profile_memory=false ;;
|
|
--profile-deep)
|
|
profile_deep=true ;;
|
|
--no-profile-deep)
|
|
profile_deep=false ;;
|
|
|
|
--record-term-sizes-as-words)
|
|
record_term_sizes_as_words=true ;;
|
|
--no-record-term-sizes-as-words)
|
|
record_term_sizes_as_words=false ;;
|
|
--record-term-sizes-as-cells)
|
|
record_term_sizes_as_cells=true ;;
|
|
--no-record-term-sizes-as-cells)
|
|
record_term_sizes_as_cells=false ;;
|
|
|
|
--use-trail)
|
|
use_trail=true ;;
|
|
--no-use-trail)
|
|
use_trail=false ;;
|
|
|
|
--trail-segments)
|
|
trail_segments=true ;;
|
|
--no-trail-segments)
|
|
trail_segments=false ;;
|
|
|
|
--use-minimal-model-stack-copy)
|
|
use_minimal_model_stack_copy=true ;;
|
|
--no-use-minimal-model-stack-copy)
|
|
use_minimal_model_stack_copy=false ;;
|
|
|
|
--use-minimal-model-own-stacks)
|
|
use_minimal_model_own_stacks=true ;;
|
|
--no-use-minimal-model-own-stacks)
|
|
use_minimal_model_own_stacks=false ;;
|
|
|
|
--minimal-model-debug)
|
|
minimal_model_debug=true ;;
|
|
--no-minimal-model-debug)
|
|
minimal_model_debug=false ;;
|
|
|
|
--single-prec-float)
|
|
single_prec_float=true ;;
|
|
--no-single-prec-float)
|
|
single_prec_float=false ;;
|
|
|
|
--pic-reg)
|
|
pic_reg=true ;;
|
|
--no-pic-reg)
|
|
pic_reg=false ;;
|
|
|
|
--debug)
|
|
debug=true ;;
|
|
--no-debug)
|
|
debug=false ;;
|
|
|
|
--decl-debug)
|
|
decl_debug=true ;;
|
|
--no-decl-debug)
|
|
decl_debug=false ;;
|
|
|
|
--ss-debug)
|
|
ss_debug=true ;;
|
|
--no-ss-debug)
|
|
ss_debug=false ;;
|
|
|
|
--low-level-debug)
|
|
ll_debug= true ;;
|
|
--no-low-level-debug)
|
|
ll_debug= false ;;
|
|
|
|
--extend-stacks-when-needed)
|
|
extend_stacks=true ;;
|
|
--no-extend-stacks-when-needed)
|
|
extend_stacks=false ;;
|
|
|
|
--stack-segments)
|
|
stack_segments=true ;;
|
|
--no-stack-segments)
|
|
stack_segments=false ;;
|
|
|
|
--use-regions)
|
|
use_regions=true;;
|
|
--no-use-regions)
|
|
use_regions=false ;;
|
|
|
|
--use-regions-debug)
|
|
use_regions_debug=true;;
|
|
--no-use-regions-debug)
|
|
use_regions_debug=false ;;
|
|
|
|
--use-regions-profiling)
|
|
use_regions_profiling=true;;
|
|
--no-use-regions-profiling)
|
|
use_regions_profiling=false ;;
|
|
|
|
-s|--grade)
|
|
shift
|
|
grade="$1";
|
|
|
|
# Convert a grade to a set of options.
|
|
#
|
|
# IMPORTANT: any changes to the handling of grades here
|
|
# may also require changes to all the files indicated by
|
|
# runtime/mercury_grade.h.
|
|
|
|
target=c
|
|
highlevel_code=false
|
|
gcc_nested_functions=false
|
|
highlevel_data=false
|
|
asm_labels=false
|
|
non_local_gotos=false
|
|
global_regs=false
|
|
thread_safe=false
|
|
gc_method=none
|
|
profile_time=false
|
|
profile_calls=false
|
|
profile_memory=false
|
|
profile_deep=false
|
|
record_term_sizes_as_words=false
|
|
record_term_sizes_as_cells=false
|
|
use_trail=false
|
|
trail_segments=false
|
|
use_minimal_model_stack_copy=false
|
|
use_minimal_model_own_stacks=false
|
|
minimal_model_debug=false
|
|
single_prec_float=false
|
|
pic_reg=false
|
|
debug=false
|
|
decl_debug=false
|
|
ss_debug=false
|
|
ll_debug=false
|
|
extend_stacks=false
|
|
stack_segments=false
|
|
use_regions=false
|
|
use_regions_debug=false
|
|
use_regions_profiling=false
|
|
|
|
grade_pieces=`echo $grade | tr '.' ' '`
|
|
for grade_piece in $grade_pieces
|
|
do
|
|
case "$grade_piece" in
|
|
il)
|
|
target=il
|
|
asm_labels=false
|
|
non_local_gotos=false
|
|
global_regs=false
|
|
highlevel_code=true
|
|
gcc_nested_functions=false
|
|
highlevel_data=true
|
|
;;
|
|
ilc)
|
|
target=il
|
|
asm_labels=false
|
|
non_local_gotos=false
|
|
global_regs=false
|
|
highlevel_code=true
|
|
gcc_nested_functions=false
|
|
highlevel_data=false
|
|
;;
|
|
java)
|
|
target=java
|
|
asm_labels=false
|
|
non_local_gotos=false
|
|
global_regs=false
|
|
highlevel_code=true
|
|
gcc_nested_functions=false
|
|
highlevel_data=true
|
|
;;
|
|
erlang)
|
|
target=erlang
|
|
;;
|
|
hl)
|
|
asm_labels=false
|
|
non_local_gotos=false
|
|
global_regs=false
|
|
highlevel_code=true
|
|
gcc_nested_functions=false
|
|
highlevel_data=true
|
|
;;
|
|
hlc)
|
|
asm_labels=false
|
|
non_local_gotos=false
|
|
global_regs=false
|
|
highlevel_code=true
|
|
gcc_nested_functions=false
|
|
highlevel_data=false
|
|
;;
|
|
hl_nest)
|
|
asm_labels=false
|
|
non_local_gotos=false
|
|
global_regs=false
|
|
highlevel_code=true
|
|
gcc_nested_functions=true
|
|
highlevel_data=true
|
|
;;
|
|
hlc_nest)
|
|
asm_labels=false
|
|
non_local_gotos=false
|
|
global_regs=false
|
|
highlevel_code=true
|
|
gcc_nested_functions=true
|
|
highlevel_data=false
|
|
;;
|
|
asm_fast)
|
|
target=c
|
|
asm_labels=true
|
|
non_local_gotos=true
|
|
global_regs=true
|
|
highlevel_code=false
|
|
gcc_nested_functions=false
|
|
highlevel_data=false
|
|
;;
|
|
asm_jump)
|
|
target=c
|
|
asm_labels=true
|
|
non_local_gotos=true
|
|
global_regs=false
|
|
highlevel_code=false
|
|
gcc_nested_functions=false
|
|
highlevel_data=false
|
|
;;
|
|
fast)
|
|
target=c
|
|
asm_labels=false
|
|
non_local_gotos=true
|
|
global_regs=true
|
|
highlevel_code=false
|
|
gcc_nested_functions=false
|
|
highlevel_data=false
|
|
;;
|
|
jump)
|
|
target=c
|
|
asm_labels=false
|
|
non_local_gotos=true
|
|
global_regs=false
|
|
highlevel_code=false
|
|
gcc_nested_functions=false
|
|
highlevel_data=false
|
|
;;
|
|
reg)
|
|
target=c
|
|
asm_labels=false
|
|
non_local_gotos=false
|
|
global_regs=true
|
|
highlevel_code=false
|
|
gcc_nested_functions=false
|
|
highlevel_data=false
|
|
;;
|
|
none)
|
|
target=c
|
|
asm_labels=false
|
|
non_local_gotos=false
|
|
global_regs=false
|
|
highlevel_code=false
|
|
gcc_nested_functions=false
|
|
highlevel_data=false
|
|
;;
|
|
|
|
par)
|
|
thread_safe=true
|
|
;;
|
|
|
|
agc)
|
|
gc_method=accurate
|
|
;;
|
|
mps)
|
|
gc_method=mps
|
|
;;
|
|
gc)
|
|
gc_method=boehm
|
|
;;
|
|
gcd)
|
|
gc_method=boehm_debug
|
|
;;
|
|
nogc)
|
|
gc_method=none
|
|
;;
|
|
|
|
memprof)
|
|
profile_time=false
|
|
profile_calls=true
|
|
profile_memory=true
|
|
profile_deep=false
|
|
;;
|
|
prof)
|
|
profile_time=true
|
|
profile_calls=true
|
|
profile_memory=false
|
|
profile_deep=false
|
|
;;
|
|
proftime)
|
|
profile_time=true
|
|
profile_calls=false
|
|
profile_memory=false
|
|
profile_deep=false
|
|
;;
|
|
profcalls)
|
|
profile_time=false
|
|
profile_calls=true
|
|
profile_memory=false
|
|
profile_deep=false
|
|
;;
|
|
profall)
|
|
profile_time=true
|
|
profile_calls=true
|
|
profile_memory=true
|
|
profile_deep=false
|
|
;;
|
|
profdeep)
|
|
profile_time=false
|
|
profile_calls=false
|
|
profile_memory=false
|
|
profile_deep=true
|
|
;;
|
|
|
|
tsw)
|
|
record_term_sizes_as_words=true
|
|
record_term_sizes_as_cells=false
|
|
;;
|
|
|
|
tsc)
|
|
record_term_sizes_as_words=false
|
|
record_term_sizes_as_cells=true
|
|
;;
|
|
|
|
tr)
|
|
use_trail=true
|
|
trail_segments=false
|
|
;;
|
|
|
|
trseg)
|
|
use_trail=true
|
|
trail_segments=true
|
|
;;
|
|
|
|
mm)
|
|
use_minimal_model_stack_copy=true
|
|
minimal_model_debug=false
|
|
;;
|
|
|
|
dmm)
|
|
use_minimal_model_stack_copy=true
|
|
minimal_model_debug=true
|
|
;;
|
|
|
|
mmsc)
|
|
use_minimal_model_stack_copy=true
|
|
minimal_model_debug=false
|
|
;;
|
|
|
|
dmmsc)
|
|
use_minimal_model_stack_copy=true
|
|
minimal_model_debug=true
|
|
;;
|
|
|
|
mmos)
|
|
use_minimal_model_own_stacks=true
|
|
minimal_model_debug=false
|
|
;;
|
|
|
|
dmmos)
|
|
use_minimal_model_own_stacks=true
|
|
minimal_model_debug=true
|
|
;;
|
|
|
|
spf)
|
|
single_prec_float=true
|
|
;;
|
|
|
|
picreg)
|
|
pic_reg=true
|
|
;;
|
|
|
|
debug)
|
|
debug=true
|
|
;;
|
|
|
|
decldebug)
|
|
decl_debug=true
|
|
;;
|
|
|
|
ssdebug)
|
|
ss_debug=true
|
|
;;
|
|
|
|
ll_debug)
|
|
ll_debug=true
|
|
;;
|
|
|
|
exts)
|
|
extend_stacks=true
|
|
;;
|
|
|
|
stseg)
|
|
stack_segments=true
|
|
;;
|
|
|
|
rbmm)
|
|
use_regions=true
|
|
use_regions_debug=false
|
|
use_regions_profiling=false
|
|
;;
|
|
|
|
rbmmd)
|
|
use_regions=true
|
|
use_regions_debug=true
|
|
use_regions_profiling=false
|
|
;;
|
|
|
|
rbmmp)
|
|
use_regions=true
|
|
use_regions_debug=false
|
|
use_regions_profiling=true
|
|
;;
|
|
|
|
rbmmdp)
|
|
use_regions=true
|
|
use_regions_debug=true
|
|
use_regions_profiling=true
|
|
;;
|
|
|
|
*)
|
|
echo "$0: unknown grade component \`$grade_piece'" 1>&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
;;
|
|
|
|
-s*)
|
|
grade="` expr $1 : '-s\(.*\)' `"
|
|
# just insert it as `--grade $grade' and then reparse it
|
|
shift
|
|
case $# in
|
|
0) set - x --grade "$grade" ;;
|
|
*) set - x --grade "$grade" "$@" ;;
|
|
esac
|
|
;;
|
|
|