#! /bin/sh
#---------------------------------------------------------------------------#
# vim: ts=4 sw=4 et ft=sh
#---------------------------------------------------------------------------#
# Copyright (C) 2000 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.
#---------------------------------------------------------------------------#
#
# canonical_grade --grade <grade-to-be-canonicalized>
#
# This script is meant to be used mainly during the autoconfiguration process.
# It is meant to be invoked with a --grade <grade> option, whose value should
# be a possibly noncanonical grade name given by a human as part of an argument
# to the configure script. The job of this script is to print the canonical
# name of the grade. The script fails after printing an error message if the
# purported "grade" given is not a grade at all, not even a non-canonical one.

# include the file `init_grade_options.sh-subr'
#---------------------------------------------------------------------------#
# vim: ts=4 sw=4 expandtab ft=sh
#---------------------------------------------------------------------------#
# Copyright (C) 1997-2007, 2010 The University of Melbourne.
# Copyright (C) 2013-2014, 2016-2017, 2020 The Mercury team.
# This file may only be copied under the terms of the GNU General
# Public License - see the file COPYING in the Mercury distribution.
#---------------------------------------------------------------------------#
#
# init_grade_options.sh-subr:
#	An `sh' subroutine for initializing grade-related options.
#	Used by the `ml', `mgnuc' and `c2init' scripts.
#
#	The code here should be inserted before a script's option-parsing
#	loop.  The invoking script must define a DEFAULT_GRADE option.
#
# 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 must initialize all the shell variables used by
# parse_grade_options.sh-subr, and must list all the options processed in
# parse_grade_options.sh-subr.
#
#---------------------------------------------------------------------------#

grade_usage="\
Grade options:
	-s <grade>, --grade <grade>
	--target {c, csharp, java}
	--asm-labels
	--gcc-non-local-gotos
	--gcc-global-registers
	-H, --high-level-code
	--parallel
	--gc {boehm, boehm_debug, hgc, accurate, none}
	-p, --profiling
	--profile-calls
	--profile-time
	--profile-memory
	--profile-deep
	--record-term-sizes-as-words
	--record-term-sizes-as-cells
	--use-trail
	--use-trail-segments
	--reserve-tag
	--use-minimal-model-stack-copy
	--use-minimal-model-own-stacks
	--minimal-model-debug
	--single-prec-float
	--pic-reg
	--no-stack-trace
	--debug
	--decl-debug
	--ss-debug
	--low-level-debug
	--extend-stacks-when-needed
	--stack-segments
	--use-regions
		See the documentation in the \"Invocation\" section
		of the Mercury User's Guide."

# --use-regions-debug and --use-regions-profiling are not yet documented
#		since they are not yet stable

target=c
highlevel_code=false
asm_labels=true
non_local_gotos=true
global_regs=true
thread_safe=false
threadscope=false
gc_method=boehm
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
use_minimal_model_stack_copy=false
use_minimal_model_own_stacks=false
minimal_model_debug=false
pregenerated_dist=false
single_prec_float=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

case $# in
	0)
        set - --grade "$DEFAULT_GRADE"
        ;;
	*)
        set - --grade "$DEFAULT_GRADE" "$@"
        ;;
esac

#---------------------------------------------------------------------------#

usage="Usage: canonical_grade --grade <actual>"

while :
do
    case "$1" in
    # include the file `parse_grade_options.sh-subr'
#---------------------------------------------------------------------------#
# vim: ts=4 sw=4 expandtab ft=sh
#---------------------------------------------------------------------------#
# Copyright (C) 1997-2007, 2010 The University of Melbourne.
# Copyright (C) 2013-2014, 2016-2017, 2020 The Mercury team.
# 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
            c|C)
                target=c
                ;;
            csharp|'C#')
                target=csharp
                ;;
            java|Java)
                target=java
                ;;
            *)
                echo "$0: invalid target \`$1'" 1>&2
                exit 1
                ;;
        esac
        ;;

    --csharp|'--C#'|--csharp-only|'--C#-only')
        target=csharp
        ;;

    --java|--Java|--java-only|--Java-only)
        target=java
        ;;

    --high-level-code|-H)
        highlevel_code=true
        ;;
    --no-high-level-code|-H-)
        highlevel_code=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|hgc|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
        ;;

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

    --pregenerated-dist)
        pregenerated_dist=true
        ;;
    --no-pregenerated-dist)
        pregenerated_dist=false
        ;;

    --single-prec-float)
        single_prec_float=true
        ;;
    --no-single-prec-float)
        single_prec_float=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
        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
        use_minimal_model_stack_copy=false
        use_minimal_model_own_stacks=false
        minimal_model_debug=false
        pregenerated_dist=false
        single_prec_float=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
                csharp)
                    target=csharp
                    asm_labels=false
                    non_local_gotos=false
                    global_regs=false
                    highlevel_code=true
                    ;;
                java)
                    target=java
                    asm_labels=false
                    non_local_gotos=false
                    global_regs=false
                    highlevel_code=true
                    ;;
                hlc)
                    asm_labels=false
                    non_local_gotos=false
                    global_regs=false
                    highlevel_code=true
                    ;;
                asm_fast)
                    target=c
                    asm_labels=true
                    non_local_gotos=true
                    global_regs=true
                    highlevel_code=false
                    ;;
                asm_jump)
                    target=c
                    asm_labels=true
                    non_local_gotos=true
                    global_regs=false
                    highlevel_code=false
                    ;;
                fast)
                    target=c
                    asm_labels=false
                    non_local_gotos=true
                    global_regs=true
                    highlevel_code=false
                    ;;
                jump)
                    target=c
                    asm_labels=false
                    non_local_gotos=true
                    global_regs=false
                    highlevel_code=false
                    ;;
                reg)
                    target=c
                    asm_labels=false
                    non_local_gotos=false
                    global_regs=true
                    highlevel_code=false
                    ;;
                none)
                    target=c
                    asm_labels=false
                    non_local_gotos=false
                    global_regs=false
                    highlevel_code=false
                    ;;

                par)
                    thread_safe=true
                    ;;

                threadscope)
                    threadscope=true
                    ;;

                agc)
                    gc_method=accurate
                    ;;
                gc)
                    gc_method=boehm
                    ;;
                hgc)
                    gc_method=hgc
                    ;;
                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
                    ;;

                trseg)
                    use_trail=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
                    ;;

                pregen)
                    pregenerated_dist=true
                    ;;

                spf)
                    single_prec_float=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
        ;;


        --)
            shift
            break
            ;;
        *)
            break
            ;;
    esac
    shift
done

if test $# -ne 0
then
    echo "$usage"
    exit 1
fi

# include the file `final_grade_options.sh-subr'
#---------------------------------------------------------------------------#
# vim: ts=4 sw=4 expandtab ft=sh
#---------------------------------------------------------------------------#
# Copyright (C) 1998-2002, 2004-2007, 2009-2010 The University of Melbourne.
# Copyright (C) 2013, 2015-2016, 2020 The Mercury team.
# This file may only be copied under the terms of the GNU General
# Public License - see the file COPYING in the Mercury distribution.
#---------------------------------------------------------------------------#
#
# final_grade_options.sh-subr:
#   An `sh' subroutine for handling implications between grade-related
#   options. Used by the `ml', `mgnuc' and `c2init' scripts.
#
#   The code here should be inserted after a script's option-parsing loop.
#
# IMPORTANT: any changes to the handling of grades here may also require
# changes to compiler/handle_options.m.
#
# This file should only use the shell variables initialized by
# init_grade_options.sh-subr.
#
#---------------------------------------------------------------------------#

use_minimal_model=false
case ${use_minimal_model_stack_copy} in
    true)
        use_minimal_model=true
        ;;
esac
case ${use_minimal_model_own_stacks} in
    true)
        use_minimal_model=true
        ;;
esac

# .tr grade is not compatible with .*mm*
#   (see comment in runtime/mercury_tabling.c for rationale)
case ${use_trail},${use_minimal_model} in
    true,true)
        echo "trailing and minimal model tabling are not compatible" 1>&2
        exit 1
        ;;
esac

# .par grade is not compatible with .*mm*
#   (see comment in runtime/mercury_grade.h for rationale)
case ${use_trail},${use_minimal_model} in
    true,true)
        echo "parallel execution and minimal model tabling are not compatible" 1>&2
        exit 1
        ;;
esac

# .exts grade is not compatible with .stseg
#   (they are alternative ways of doing the same thing)
case ${extend_stacks},${stack_segments} in
    true,true)
        echo "--extend-stacks-when-needed and --stack-segments are not compatible" 1>&2
        exit 1
        ;;
esac

# stack segments are not compatible with high-level code
case $highlevel_code,$stack_segments in true,true)
    echo "--high-level-code and --stack-segments are not compatible" 1>&2
    exit 1 ;;
esac

# .debug grades are not compatible with high-level code
case ${highlevel_code},${debug} in
    true,true)
        echo "--high-level-code and --debug are not compatible" 1>&2
        exit 1
        ;;
esac

# .decldebug grades are not compatible with high-level code
case ${highlevel_code},${decl_debug} in
    true,true)
        echo "--high-level-code and --decl-debug are not compatible" 1>&2
        exit 1
        ;;
esac

# .profdeep grades are not compatible with high-level code
case ${highlevel_code},${profile_deep} in
    true,true)
        echo "--high-level-code and --deep-profiling are not compatible" 1>&2
        exit 1
        ;;
esac

# The non-C backends do not support single-precision floats, time profiling,
# memory profiling or deep profiling.
case ${target} in
    csharp|java)
        case ${single_prec_float} in
            true)
                echo "--single-prec-float and --target $target are not compatible" 1>&2
                exit 1
                ;;
        esac
        case ${profile_time} in
            true)
                echo "--profile-time and --target $target are not compatible" 1>&2
                exit 1
                ;;
        esac
        case ${profile_memory} in
            true)
                echo "--profile-memory and --target $target are not compatible" 1>&2
                exit 1
                ;;
        esac
        case ${profile_deep} in
            true)
                echo "--profile-deep and --target $target are not compatible" 1>&2
                exit 1
                ;;
        esac
        ;;
esac

# --decl-debug implies --debug
case ${decl_debug} in
    true)
        debug=true
        ;;
esac

# --target C#, Java implies --high-level-code
case ${target} in
    csharp|java)
        highlevel_code=true
        ;;
esac

# --target C#, Java implies --gc automatic.
# NOTE: the .par grade component is meaningless for the non-C backends,
# so we set it to false if they are being used.  This avoids having to
# deal with grades like "java.par".
case ${target} in
    csharp|java)
        gc_method=automatic
        thread_safe=false
        ;;
esac

# --high-level-code disables the use of low-level gcc extensions
case ${highlevel_code} in
    true)
        non_local_gotos=false
        asm_labels=false
        global_regs=false
        ;;
esac

# --use-regions-debug and --use-regions-profiling aren't meaningful
# without --use-regions
case ${use_regions} in
    false)
        use_regions_debug=false
        use_regions_profiling=false
        ;;
esac

# threadscope doesn't make sense in non-parallel grades.
case ${thread_safe} in
    false)
        threadscope=false
        ;;
esac

#---------------------------------------------------------------------------#

# include the file `canonical_grade.sh-subr'
#---------------------------------------------------------------------------#
# vim: ts=4 sw=4 expandtab ft=sh
#---------------------------------------------------------------------------#
# Copyright (C) 2000-2007, 2010 The University of Melbourne.
# Copyright (C) 2013-2017, 2020 The Mercury team.
# This file may only be copied under the terms of the GNU General
# Public License - see the file COPYING in the Mercury distribution.
#---------------------------------------------------------------------------#
#
# canonical_grade.sh-subr:
#
# An `sh' subroutine for computing a canonical grade string based on
# the values of grade-related options.
# It is used by the `ml', `c2init' and `canonical_grade' scripts.
#
# The code here should be inserted after init_grade_options.sh-subr,
# parse_grade_options.sh-subr and final_grade_options.sh-subr, which
# together define a set of shell variables giving the values of the
# various grade options.
#
# Canonical_grade.sh-subr defines the variable GRADE, which will contain
# the canonical string for the grade implied by the option values.
#
# If the option values are inconsistent, this script fragment will print
# an error message and exit with failure.
#
# IMPORTANT: any changes to the handling of grades here may also require
# changes to all the files indicated by runtime/mercury_grade.h.

case ${highlevel_code},${target} in
    true,*)
        case ${target} in
            c)
                GRADE="hlc"
                ;;
            csharp)
                GRADE="csharp"
                ;;
            java)
                GRADE="java"
                ;;
            *)
                progname=`basename $0`
                echo "${progname}: unknown target: ${target}"
                exit 1
                ;;
        esac

        case ${non_local_gotos} in
            true)
                echo "${progname}: error: nonlocal gotos are not compatible" 1>&2
                echo "${progname}: with \'--high-level-code'" 1>&2
                exit 1
                ;;
        esac

        case ${global_regs} in
            true)
                echo "${progname}: error: use of global registers is not compatible" 1>&2
                echo "${progname}: with \'--high-level-code'" 1>&2
                exit 1
                ;;
        esac

        case ${asm_labels} in
            true)
                echo "${progname}: error: use of asm labels is not compatible" 1>&2
                echo "${progname}: with \'--high-level-code'" 1>&2
                exit 1
                ;;
        esac
        ;;
    false,*)
        case ${target} in
            c)
                ;;
            *)
                echo "${progname}: error: \`--no-high-level-code' is not compatible" 1>&2
                echo "${progname}: with any target language except C" 1>&2
                exit 1
        esac

        case ${non_local_gotos},${global_regs} in
            true,true)      GRADE="fast" ;;
            true,false)     GRADE="jump" ;;
            false,true)     GRADE="reg"  ;;
            false,false)    GRADE="none" ;;
        esac

        case ${asm_labels} in
            true)       GRADE="asm_${GRADE}" ;;
            false)      ;;
        esac
        ;;
    *)
        echo "${progname}: internal error: \`--high-level-code' is not set" 1>&2
        exit 1
        ;;
esac

case ${thread_safe},${threadscope} in
    true,false)
        GRADE="${GRADE}.par"
        ;;
    true,true)
        GRADE="${GRADE}.par.threadscope"
        ;;
    false,false)
        ;;
    *)
        echo "${progname}: error: The 'threadscope' grade component may only be" 1>&2
        echo "${progname}: error: used in parallel grades"
        exit 1
        ;;
esac

case ${gc_method} in
    conservative)   GRADE="${GRADE}.gc"  ;;     # deprecated; alias for boehm
    boehm)          GRADE="${GRADE}.gc"  ;;
    boehm_debug)    GRADE="${GRADE}.gcd" ;;
    hgc)            GRADE="${GRADE}.hgc" ;;
    accurate)       GRADE="${GRADE}.agc" ;;
esac

case ${profile_time},${profile_calls},${profile_memory},${profile_deep} in
    true,true,false,false)
        GRADE="${GRADE}.prof"
        ;;
    true,false,false,false)
        GRADE="${GRADE}.proftime"
        ;;
    false,true,false,false)
        GRADE="${GRADE}.profcalls"
        ;;
    true,true,true,false)
        GRADE="${GRADE}.profall"
        ;;
    false,true,true,false)
        GRADE="${GRADE}.memprof"
        ;;
    false,false,false,true)
        GRADE="${GRADE}.profdeep"
        ;;
    false,false,false,false)
        ;;
    *)
        progname=`basename $0`
        echo "${progname}: error: invalid combination of profiling options." 1>&2
        exit 1
        ;;
esac

case ${record_term_sizes_as_words},${record_term_sizes_as_cells} in
    true,false)
        GRADE="${GRADE}.tsw"
        ;;
    false,true)
        GRADE="${GRADE}.tsc"
        ;;
    false,false)
        ;;
    *)
        progname=`basename $0`
        echo "${progname}: error: invalid combination of term size profiling options." 1>&2
        exit 1
        ;;
esac

case ${use_trail} in
    true)
        GRADE="${GRADE}.tr" ;;
    *)
        ;;
esac

case ${use_minimal_model_stack_copy},${use_minimal_model_own_stacks},${minimal_model_debug} in
    true,false,false)
        GRADE="${GRADE}.mmsc"
        ;;
    true,false,true)
        GRADE="${GRADE}.dmmsc"
        ;;
    false,true,false)
        GRADE="${GRADE}.mmos"
        ;;
    false,true,true)
        GRADE="${GRADE}.dmmos"
        ;;
    *)
        ;;
esac

case ${pregenerated_dist},${single_prec_float} in
    true,false)
        GRADE="${GRADE}.pregen"
        ;;
    false,true)
        GRADE="${GRADE}.spf"
        ;;
    false,false)
        ;;
    *)
        progname=`basename $0`
        echo "${progname}: error: pregenerated dist incompatible with single-prec float." 1>&2
        exit 1
        ;;
esac

case ${debug},${decl_debug},${ss_debug} in
    true,true,false)
        GRADE="${GRADE}.decldebug"
        ;;
    true,false,false)
        GRADE="${GRADE}.debug"
        ;;
    false,false,true)
        GRADE="${GRADE}.ssdebug"
        ;;
    false,false,false)
        ;;
    *)
        progname=`basename $0`
        echo "${progname}: error: invalid combination of debugging options." 1>&2
        exit 1
        ;;
esac

case ${ll_debug} in
    true)
        GRADE="${GRADE}.ll_debug"
        ;;
    *)
        ;;
esac;

case ${extend_stacks},${stack_segments} in
    true,false)
        GRADE="${GRADE}.exts"
        ;;
    false,true)
        GRADE="${GRADE}.stseg"
        ;;
    false,false)
        ;;
    *)
        progname=`basename $0`
        echo "${progname}: error: invalid combination of stack extension options." 1>&2
        exit 1
        ;;
esac

case ${use_regions} in
    true)
        case ${use_regions_debug},${use_regions_profiling} in
            false,false)    GRADE="${GRADE}.rbmm"   ;;
            false,true)     GRADE="${GRADE}.rbmmp"  ;;
            true,false)     GRADE="${GRADE}.rbmmd"  ;;
            true,true)      GRADE="${GRADE}.rbmmdp" ;;
        esac
        ;;
    false)
        ;;
esac

echo $GRADE
exit 0
