Commit 54320207 by Janne Blomqvist

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
parent 4c9dbb96
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> 2019-08-10 Steven G. Kargl <kargl@gcc.gnu.org>
* decl.c (match_old_style_init): Use a clearer error message. * decl.c (match_old_style_init): Use a clearer error message.
......
...@@ -1720,7 +1720,7 @@ This option currently only affects local arrays declared with constant ...@@ -1720,7 +1720,7 @@ 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.
Future versions of GNU Fortran may improve this behavior. 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 @item -fstack-arrays
@opindex @code{fstack-arrays} @opindex @code{fstack-arrays}
......
...@@ -437,7 +437,7 @@ gfc_post_options (const char **pfilename) ...@@ -437,7 +437,7 @@ gfc_post_options (const char **pfilename)
/* Set default. */ /* Set default. */
if (flag_max_stack_var_size == -2) 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. */ /* Implement -fno-automatic as -fmax-stack-var-size=0. */
if (!flag_automatic) if (!flag_automatic)
......
...@@ -753,6 +753,16 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym) ...@@ -753,6 +753,16 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym)
|| sym->attr.allocatable) || sym->attr.allocatable)
&& !DECL_ARTIFICIAL (decl)) && !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; TREE_STATIC (decl) = 1;
/* Because the size of this variable isn't known until now, we may have /* Because the size of this variable isn't known until now, we may have
......
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