Files
mercury/scripts/parse_grade_options.sh-subr
Julien Fischer 9c98a60bd5 Add a mechanism for dynamically growing the trail by adding new segments to it
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.
2008-09-05 11:19:34 +00:00

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
;;