Commit 1e7de83b by Asher Langton Committed by Tobias Burnus

gfortran.h (gfc_option_t): Add flag_recursive.

2007-08-26  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-26  Asher Langton  <langton2@llnl.gov>

	* gfortran.dg/recursive_stack.f90: New.
	* gfortran.dg/openmp_stack.f90: New.


Co-Authored-By: Tobias Burnus <burnus@net-b.de>

From-SVN: r127813
parent 7b89fb3c
2007-08-26 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-26 Tobias Burnus <burnus@net-b.de> 2007-08-26 Tobias Burnus <burnus@net-b.de>
PR fortran/31298 PR fortran/31298
......
...@@ -1863,6 +1863,7 @@ typedef struct ...@@ -1863,6 +1863,7 @@ typedef struct
int flag_openmp; int flag_openmp;
int flag_sign_zero; int flag_sign_zero;
int flag_module_private; int flag_module_private;
int flag_recursive;
int fpe; int fpe;
......
...@@ -156,7 +156,7 @@ and warnings}. ...@@ -156,7 +156,7 @@ and warnings}.
-fsecond-underscore @gol -fsecond-underscore @gol
-fbounds-check -fmax-stack-var-size=@var{n} @gol -fbounds-check -fmax-stack-var-size=@var{n} @gol
-fpack-derived -frepack-arrays -fshort-enums -fexternal-blas @gol -fpack-derived -frepack-arrays -fshort-enums -fexternal-blas @gol
-fblas-matmul-limit=@var{n}} -fblas-matmul-limit=@var{n} -frecursive}
@end table @end table
@menu @menu
...@@ -296,7 +296,7 @@ and @code{c$omp}, @code{*$omp} and @code{!$omp} directives in fixed form, ...@@ -296,7 +296,7 @@ and @code{c$omp}, @code{*$omp} and @code{!$omp} directives in fixed form,
@code{!$} conditional compilation sentinels in free form @code{!$} conditional compilation sentinels in free form
and @code{c$}, @code{*$} and @code{!$} sentinels in fixed form, and @code{c$}, @code{*$} and @code{!$} sentinels in fixed form,
and when linking arranges for the OpenMP runtime library to be linked and when linking arranges for the OpenMP runtime library to be linked
in. in. The option @option{-fopenmp} implies @option{-frecursive}.
@item -frange-check @item -frange-check
@opindex @code{frange-check} @opindex @code{frange-check}
...@@ -710,10 +710,13 @@ it. ...@@ -710,10 +710,13 @@ it.
@opindex @code{fno-automatic} @opindex @code{fno-automatic}
@cindex @code{SAVE} statement @cindex @code{SAVE} statement
@cindex statement, @code{SAVE} @cindex statement, @code{SAVE}
Treat each program unit as if the @code{SAVE} statement was specified for Treat each program unit (except those marked as RECURSIVE) as if the
every local variable and array referenced in it. Does not affect common @code{SAVE} statement were specified for every local variable and array
blocks. (Some Fortran compilers provide this option under the name referenced in it. Does not affect common blocks. (Some Fortran compilers
@option{-static}.) provide this option under the name @option{-static} or @option{-save}.)
The default, which is @option{-fautomatic}, uses the stack for local
variables smaller than the value given by @option{-fmax-stack-var-size}.
Use the option @option{-frecursive} to use no static memory.
@item -ff2c @item -ff2c
@opindex ff2c @opindex ff2c
...@@ -865,7 +868,10 @@ substring references. ...@@ -865,7 +868,10 @@ substring references.
@item -fmax-stack-var-size=@var{n} @item -fmax-stack-var-size=@var{n}
@opindex @code{fmax-stack-var-size} @opindex @code{fmax-stack-var-size}
This option specifies the size in bytes of the largest array that will be put 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. Use @option{-fno-automatic} to never use the stack.
This option currently only affects local arrays declared with constant This option currently only affects local arrays declared with constant
bounds, and may not apply to all character variables. bounds, and may not apply to all character variables.
...@@ -919,6 +925,12 @@ geometric mean of the dimensions of the argument and result matrices. ...@@ -919,6 +925,12 @@ geometric mean of the dimensions of the argument and result matrices.
The default value for @var{n} is 30. 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 used together with
@option{-fmax-stack-var-size=} or @option{-fno-automatic}.
@end table @end table
@xref{Code Gen Options,,Options for Code Generation Conventions, @xref{Code Gen Options,,Options for Code Generation Conventions,
......
...@@ -218,7 +218,7 @@ Set default accessibility of module entities to PRIVATE. ...@@ -218,7 +218,7 @@ Set default accessibility of module entities to PRIVATE.
fopenmp fopenmp
Fortran Fortran
Enable OpenMP Enable OpenMP (also sets frecursive)
fpack-derived fpack-derived
Fortran Fortran
...@@ -240,6 +240,10 @@ frecord-marker=8 ...@@ -240,6 +240,10 @@ frecord-marker=8
Fortran RejectNegative Fortran RejectNegative
Use an 8-byte record marker for unformatted files Use an 8-byte record marker for unformatted files
frecursive
Fortran
Allocate local variables on the stack to allow indirect recursion
frepack-arrays frepack-arrays
Fortran Fortran
Copy array sections into a contiguous block on procedure entry Copy array sections into a contiguous block on procedure entry
......
...@@ -86,7 +86,10 @@ gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED, ...@@ -86,7 +86,10 @@ gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED,
gfc_option.flag_f2c = 0; gfc_option.flag_f2c = 0;
gfc_option.flag_second_underscore = -1; gfc_option.flag_second_underscore = -1;
gfc_option.flag_implicit_none = 0; 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_range_check = 1;
gfc_option.flag_pack_derived = 0; gfc_option.flag_pack_derived = 0;
gfc_option.flag_repack_arrays = 0; gfc_option.flag_repack_arrays = 0;
...@@ -103,6 +106,7 @@ gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED, ...@@ -103,6 +106,7 @@ gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED,
gfc_option.flag_d_lines = -1; gfc_option.flag_d_lines = -1;
gfc_option.flag_openmp = 0; gfc_option.flag_openmp = 0;
gfc_option.flag_sign_zero = 1; gfc_option.flag_sign_zero = 1;
gfc_option.flag_recursive = 0;
gfc_option.fpe = 0; gfc_option.fpe = 0;
...@@ -290,6 +294,37 @@ gfc_post_options (const char **pfilename) ...@@ -290,6 +294,37 @@ gfc_post_options (const char **pfilename)
if (gfc_option.flag_second_underscore == -1) if (gfc_option.flag_second_underscore == -1)
gfc_option.flag_second_underscore = gfc_option.flag_f2c; 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. */ /* Implement -fno-automatic as -fmax-stack-var-size=0. */
if (!gfc_option.flag_automatic) if (!gfc_option.flag_automatic)
gfc_option.flag_max_stack_var_size = 0; gfc_option.flag_max_stack_var_size = 0;
...@@ -698,6 +733,11 @@ gfc_handle_option (size_t scode, const char *arg, int value) ...@@ -698,6 +733,11 @@ gfc_handle_option (size_t scode, const char *arg, int value)
MAX_SUBRECORD_LENGTH); MAX_SUBRECORD_LENGTH);
gfc_option.max_subrecord_length = value; gfc_option.max_subrecord_length = value;
break;
case OPT_frecursive:
gfc_option.flag_recursive = 1;
break;
} }
return result; return result;
......
2007-08-26 Asher Langton <langton2@llnl.gov>
* gfortran.dg/recursive_stack.f90: New.
* gfortran.dg/openmp_stack.f90: New.
2007-08-26 Tobias Burnus <burnus@net-b.de> 2007-08-26 Tobias Burnus <burnus@net-b.de>
PR fortran/31298 PR fortran/31298
! { dg-do run}
! { dg-options "-fopenmp" }
program openmp_stack
implicit none
integer id
integer ilocs(2)
integer omp_get_thread_num, foo
call omp_set_num_threads (2)
!$omp parallel private (id)
id = omp_get_thread_num() + 1
ilocs(id) = foo()
!$omp end parallel
! Check that the two threads are not sharing a location for
! the array x in foo()
if (ilocs(1) .eq. ilocs(2)) call abort
end program openmp_stack
integer function foo ()
implicit none
real x(100,100)
foo = loc(x)
end function foo
! { dg-do run}
! { dg-options "-frecursive" }
program recursive_stack
call foo (.true.)
end program recursive_stack
subroutine foo (recurse)
logical recurse
integer iarray(100,100)
if (recurse) then
iarray(49,49) = 17
call bar
if (iarray(49,49) .ne. 17) call abort
else
iarray(49,49) = 21
end if
end subroutine foo
subroutine bar
call foo (.false.)
end subroutine bar
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment