PR fortran/91413 Generate warning when making array static

When moving a local variable from the stack to static storage, the
procedure is no longer safe to be called recursively or concurrently
from multiple threads.  Thus generate a warning when this is done.
Also double the default limit for switching from stack to static.

Regtested on x86_64-pc-linux-gnu.

gcc/fortran/ChangeLog:

2019-08-11  Janne Blomqvist  <jb@gcc.gnu.org>

	PR fortran/91413
	* invoke.texi (-fmax-stack-var-size): Document increased default.
	* options.c (gfc_post_options): Increase default stack var size to
	65536 bytes.
	* trans-decl.c (gfc_finish_var_decl): Generate warning when local
	array moved to static storage.

From-SVN: r274264
This commit is contained in:
Janne Blomqvist 2019-08-11 12:42:41 +03:00
parent 4c9dbb967f
commit 543202079c
4 changed files with 21 additions and 2 deletions

View File

@ -1,3 +1,12 @@
2019-08-11 Janne Blomqvist <jb@gcc.gnu.org>
PR fortran/91413
* invoke.texi (-fmax-stack-var-size): Document increased default.
* options.c (gfc_post_options): Increase default stack var size to
65536 bytes.
* trans-decl.c (gfc_finish_var_decl): Generate warning when local
array moved to static storage.
2019-08-10 Steven G. Kargl <kargl@gcc.gnu.org>
* decl.c (match_old_style_init): Use a clearer error message.

View File

@ -1720,7 +1720,7 @@ This option currently only affects local arrays declared with constant
bounds, and may not apply to all character variables.
Future versions of GNU Fortran may improve this behavior.
The default value for @var{n} is 32768.
The default value for @var{n} is 65536.
@item -fstack-arrays
@opindex @code{fstack-arrays}

View File

@ -437,7 +437,7 @@ gfc_post_options (const char **pfilename)
/* Set default. */
if (flag_max_stack_var_size == -2)
flag_max_stack_var_size = 32768;
flag_max_stack_var_size = 65536;
/* Implement -fno-automatic as -fmax-stack-var-size=0. */
if (!flag_automatic)

View File

@ -753,6 +753,16 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym)
|| sym->attr.allocatable)
&& !DECL_ARTIFICIAL (decl))
{
gfc_warning (OPT_Wsurprising,
"Array %qs at %L is larger than limit set by"
" %<-fmax-stack-var-size=%>, moved from stack to static"
" storage. This makes the procedure unsafe when called"
" recursively, or concurrently from multiple threads."
" Consider using %<-frecursive%>, or increase the"
" %<-fmax-stack-var-size=%> limit, or change the code to"
" use an ALLOCATABLE array.",
sym->name, &sym->declared_at);
TREE_STATIC (decl) = 1;
/* Because the size of this variable isn't known until now, we may have