[Patch, Fortran] Add -frecursive, imply it with -fopenmp, check for flag conflicts and update invoke.texi
Jerry DeLisle
jvdelisle@verizon.net
Sun Aug 26 20:26:00 GMT 2007
Tobias Burnus wrote:
> :ADDPATCH fortran:
>
> This patch supercedes the patch by Asher,
> http://gcc.gnu.org/ml/gcc-patches/2007-08/msg00960.html
> and by me
> http://gcc.gnu.org/ml/gcc-patches/2007-08/msg00996.html
>
> By default, gfortran currently puts local variables (with known bounds),
> which are smaller than 32kbits, on the stack, variables which are
> bigger are marked as static. (And automatic variables etc. are allocated
> on the heap.)
>
> Some legacy applications imply SAVE without actually specifying it; in
> this case -fno-automatic (or -fmax-stack-var-size=0) has to be used.
>
> Other legacy applications call procedures recursively without using the
> RECURSIVE attribute - or the recursion happens through the backdoor via
> parallelization (OpenMP, but potentially also shared-memory MPI, Posix
> Threads, ...). In this case the local variables of such procedures shall
> not be in static memory.
>
> Internally, gfortran uses gfc_option.flag_max_stack_var_size = -1 for
> the latter, but since "fmax-stack-var-size=" is "UInteger" thus -1
> cannot be set from the command line.
>
> This patch introduces the option -frecursive to disable static memory
> for local variables; makes -fopenmp imply -frecursive and adds a couple
> of warning if conflicting options have been specified. The hierarchy of
> the options is:
>
> 1. Implied: stack-var-size = 32 k (implied by the default
> -fmax-stack-var-size= 32k and -fautomatic)
> 2. -fopenmp implies: stack-var-size=-1
> 3. Explicitly set -fmax-stack-var-size=<n>
> 4. -frecursive: stack-var-size=-1
> 5. -fno-automatic: stack-var-size=0
>
> Regression tested on x86_64-unknown-linux-gnu and with "make info" and
> "make pdf".
> Ok for the trunk?
>
Some minor edits below for invoke.texi, otherwise OK.
> Tobias
>
>
> ------------------------------------------------------------------------
>
> 2007-08-20 Asher Langton <langton2@llnl.gov>
> Tobias Burnus <burnus@net-b.de>
>
> * gfortran.h (gfc_option_t): Add flag_recursive.
> * lang.opt: Add -frecursive option and update -fopenmp.
> * invoke.texi (-frecursive): Document new option.
> (-fopenmp,-fno-automatic,-fmax-stack-var-size): Update.
> * options.c (gfc_init_options, gfc_post_options,
> gfc_handle_option): Add -frecursive and modify -fopenmp.
> (gfc_post_options): Add warning for conflicting flags.
>
> 2007-08-20 Asher Langton <langton2@llnl.gov>
>
> * gfortran.dg/recursive_stack.f90: New.
> * gfortran.dg/openmp_stack.f90: New.
>
> Index: gcc/fortran/gfortran.h
> ===================================================================
> --- gcc/fortran/gfortran.h (Revision 127641)
> +++ gcc/fortran/gfortran.h (Arbeitskopie)
> @@ -1863,6 +1866,7 @@ typedef struct
> int flag_openmp;
> int flag_sign_zero;
> int flag_module_private;
> + int flag_recursive;
>
> int fpe;
>
> Index: gcc/fortran/lang.opt
> ===================================================================
> --- gcc/fortran/lang.opt (Revision 127641)
> +++ gcc/fortran/lang.opt (Arbeitskopie)
> @@ -218,7 +218,7 @@ Set default accessibility of module enti
>
> fopenmp
> Fortran
> -Enable OpenMP
> +Enable OpenMP (also sets frecursive)
>
> fpack-derived
> Fortran
> @@ -240,6 +240,10 @@ frecord-marker=8
> Fortran RejectNegative
> Use an 8-byte record marker for unformatted files
>
> +frecursive
> +Fortran
> +Allocate local variables on the stack to allow indirect recursion
> +
> frepack-arrays
> Fortran
> Copy array sections into a contiguous block on procedure entry
> Index: gcc/fortran/options.c
> ===================================================================
> --- gcc/fortran/options.c (Revision 127641)
> +++ gcc/fortran/options.c (Arbeitskopie)
> @@ -86,7 +86,10 @@ gfc_init_options (unsigned int argc ATTR
> gfc_option.flag_f2c = 0;
> gfc_option.flag_second_underscore = -1;
> gfc_option.flag_implicit_none = 0;
> - gfc_option.flag_max_stack_var_size = 32768;
> +
> + /* Default value of flag_max_stack_var_size is set in gfc_post_options. */
> + gfc_option.flag_max_stack_var_size = -2;
> +
> gfc_option.flag_range_check = 1;
> gfc_option.flag_pack_derived = 0;
> gfc_option.flag_repack_arrays = 0;
> @@ -103,6 +106,7 @@ gfc_init_options (unsigned int argc ATTR
> gfc_option.flag_d_lines = -1;
> gfc_option.flag_openmp = 0;
> gfc_option.flag_sign_zero = 1;
> + gfc_option.flag_recursive = 0;
>
> gfc_option.fpe = 0;
>
> @@ -290,6 +294,37 @@ gfc_post_options (const char **pfilename
> if (gfc_option.flag_second_underscore == -1)
> gfc_option.flag_second_underscore = gfc_option.flag_f2c;
>
> + if (!gfc_option.flag_automatic && gfc_option.flag_max_stack_var_size != -2
> + && gfc_option.flag_max_stack_var_size != 0)
> + gfc_warning_now ("Flag -fno-automatic overwrites -fmax-stack-var-size=%d",
> + gfc_option.flag_max_stack_var_size);
> + else if (!gfc_option.flag_automatic && gfc_option.flag_recursive)
> + gfc_warning_now ("Flag -fno-automatic overwrites -frecursive");
> + else if (!gfc_option.flag_automatic && gfc_option.flag_openmp)
> + gfc_warning_now ("Flag -fno-automatic overwrites -frecursive implied by "
> + "-fopenmp");
> + else if (gfc_option.flag_max_stack_var_size != -2
> + && gfc_option.flag_recursive)
> + gfc_warning_now ("Flag -frecursive overwrites -fmax-stack-var-size=%d",
> + gfc_option.flag_max_stack_var_size);
> + else if (gfc_option.flag_max_stack_var_size != -2
> + && gfc_option.flag_openmp)
> + gfc_warning_now ("Flag -fmax-stack-var-size=%d overwrites -frecursive "
> + "implied by -fopenmp",
> + gfc_option.flag_max_stack_var_size);
> +
> + /* Implied -frecursive; implemented as -fmax-stack-var-size=-1. */
> + if (gfc_option.flag_max_stack_var_size == -2 && gfc_option.flag_openmp)
> + gfc_option.flag_max_stack_var_size = -1;
> +
> + /* Set default. */
> + if (gfc_option.flag_max_stack_var_size == -2)
> + gfc_option.flag_max_stack_var_size = 32768;
> +
> + /* Implement -frecursive as -fmax-stack-var-size=-1. */
> + if (gfc_option.flag_recursive)
> + gfc_option.flag_max_stack_var_size = -1;
> +
> /* Implement -fno-automatic as -fmax-stack-var-size=0. */
> if (!gfc_option.flag_automatic)
> gfc_option.flag_max_stack_var_size = 0;
> @@ -698,6 +733,11 @@ gfc_handle_option (size_t scode, const c
> MAX_SUBRECORD_LENGTH);
>
> gfc_option.max_subrecord_length = value;
> + break;
> +
> + case OPT_frecursive:
> + gfc_option.flag_recursive = 1;
> + break;
> }
>
> return result;
> Index: gcc/fortran/invoke.texi
> ===================================================================
> --- gcc/fortran/invoke.texi (Revision 127641)
> +++ gcc/fortran/invoke.texi (Arbeitskopie)
> @@ -156,7 +156,7 @@ and warnings}.
> -fsecond-underscore @gol
> -fbounds-check -fmax-stack-var-size=@var{n} @gol
> -fpack-derived -frepack-arrays -fshort-enums -fexternal-blas @gol
> --fblas-matmul-limit=@var{n}}
> +-fblas-matmul-limit=@var{n} -frecursive}
> @end table
>
> @menu
> @@ -296,7 +296,7 @@ and @code{c$omp}, @code{*$omp} and @code
> @code{!$} conditional compilation sentinels in free form
> and @code{c$}, @code{*$} and @code{!$} sentinels in fixed form,
> and when linking arranges for the OpenMP runtime library to be linked
> -in.
> +in. The option @option{-fopenmp} implies @option{-frecursive}.
>
> @item -frange-check
> @opindex @code{frange-check}
> @@ -710,10 +710,13 @@ it.
> @opindex @code{fno-automatic}
> @cindex @code{SAVE} statement
> @cindex statement, @code{SAVE}
> -Treat each program unit as if the @code{SAVE} statement was specified for
> -every local variable and array referenced in it. Does not affect common
> -blocks. (Some Fortran compilers provide this option under the name
> -@option{-static}.)
> +Treat each program unit (except those marked as RECURSIVE) as if the
> +@code{SAVE} statement were specified for every local variable and array
> +referenced in it. Does not affect common blocks. (Some Fortran compilers
> +provide this option under the name @option{-static} or @option{-save}.)
> +The default is @option{-fautomatic} which uses the stack for local
s/default is/default, which is/ s/ which uses/, uses/
> +variables smaller than the value given by @option{-fmax-stack-var-size}.
> +Use the option @option{-frecursive} to use no static memory.
>
> @item -ff2c
> @opindex ff2c
> @@ -865,7 +868,10 @@ substring references.
> @item -fmax-stack-var-size=@var{n}
> @opindex @code{fmax-stack-var-size}
> This option specifies the size in bytes of the largest array that will be put
> -on the stack.
> +on the stack; if the size is exceeded static memory is used (except in
> +procedures marked as RECURSIVE). Use the option @option{-frecursive} to
> +allow for recursive procedures which do not have a RECURSIVE attribute or
> +for parallel programs. And use @option{-fno-automatic} to use never the stack.
s/And use/Use/ s/to use never/to never use/
>
> This option currently only affects local arrays declared with constant
> bounds, and may not apply to all character variables.
> @@ -919,6 +925,12 @@ geometric mean of the dimensions of the
>
> The default value for @var{n} is 30.
>
> +@item -frecursive
> +@opindex @code{frecursive}
> +Allow indirect recursion by forcing all local arrays to be allocated
> +on the stack. This flag cannot be use together with
s/use together/used together/
> +@option{-fmax-stack-var-size=} or @option{-fno-automatic}.
> +
Thanks,
Jerry
More information about the Fortran
mailing list