Commit 14688b8d by Thomas Koenig

re PR fortran/90329 (Incompatibility between gfortran and C lapack calls)

2019-05-19  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/90329
	* invoke.texi: Document -fbroken-callers.
	* lang.opt: Add -fbroken-callers.
	* trans-decl.c (create_function_arglist): Only set
	DECL_HIDDEN_STRING_LENGTH if flag_broken_callers is set.

From-SVN: r271376
parent f12b0a62
2019-05-19 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/90329
* invoke.texi: Document -fbroken-callers.
* lang.opt: Add -fbroken-callers.
* trans-decl.c (create_function_arglist): Only set
DECL_HIDDEN_STRING_LENGTH if flag_broken_callers is set.
2019-05-17 Thomas Schwinge <thomas@codesourcery.com> 2019-05-17 Thomas Schwinge <thomas@codesourcery.com>
PR fortran/89433 PR fortran/89433
......
...@@ -181,7 +181,7 @@ and warnings}. ...@@ -181,7 +181,7 @@ and warnings}.
@item Code Generation Options @item Code Generation Options
@xref{Code Gen Options,,Options for code generation conventions}. @xref{Code Gen Options,,Options for code generation conventions}.
@gccoptlist{-faggressive-function-elimination -fblas-matmul-limit=@var{n} @gol @gccoptlist{-faggressive-function-elimination -fblas-matmul-limit=@var{n} @gol
-fbounds-check -fcheck-array-temporaries @gol -fbounds-check -fbroken-callers -fcheck-array-temporaries @gol
-fcheck=@var{<all|array-temps|bounds|do|mem|pointer|recursion>} @gol -fcheck=@var{<all|array-temps|bounds|do|mem|pointer|recursion>} @gol
-fcoarray=@var{<none|single|lib>} -fexternal-blas -ff2c -fcoarray=@var{<none|single|lib>} -fexternal-blas -ff2c
-ffrontend-loop-interchange @gol -ffrontend-loop-interchange @gol
...@@ -1617,6 +1617,34 @@ warnings for generated array temporaries. ...@@ -1617,6 +1617,34 @@ warnings for generated array temporaries.
@c Note: This option is also referred in gcc's manpage @c Note: This option is also referred in gcc's manpage
Deprecated alias for @option{-fcheck=bounds}. Deprecated alias for @option{-fcheck=bounds}.
@item -fbroken-callers
@opindex @code{broken-callers}
Some C interfaces to Fortran codes violate the gfortran ABI by
omitting the hidden character length arguments as described in
@xref{Argument passing conventions}. This can lead to crashes
because pushing arguments for tail calls can overflow the stack.
To provide a workaround for existing binary packages, this option
disables tail call optimization for gfortran procedures with character
arguments.
Using this option can lead to problems including crashes due to
insufficient stack space.
It is @emph{very strongly} recommended to fix the code in question.
The @option{-fc-prototypes-external} option can be used to generate
prototypes which conform to gfortran's ABI, for inclusion in the
source code.
Support for this option will likely be withdrawn in a future release
of gfortran.
The negative form, @option{-fno-broken-callers}, can be used to
disable this option.
Default is currently @option{-fbroken-callers}, this will change
in future releases.
@item -fcheck-array-temporaries @item -fcheck-array-temporaries
@opindex @code{fcheck-array-temporaries} @opindex @code{fcheck-array-temporaries}
Deprecated alias for @option{-fcheck=array-temps}. Deprecated alias for @option{-fcheck=array-temps}.
......
...@@ -397,6 +397,10 @@ fblas-matmul-limit= ...@@ -397,6 +397,10 @@ fblas-matmul-limit=
Fortran RejectNegative Joined UInteger Var(flag_blas_matmul_limit) Init(30) Fortran RejectNegative Joined UInteger Var(flag_blas_matmul_limit) Init(30)
-fblas-matmul-limit=<n> Size of the smallest matrix for which matmul will use BLAS. -fblas-matmul-limit=<n> Size of the smallest matrix for which matmul will use BLAS.
fbroken-callers
Fortran Var(flag_broken_callers) Init(1)
Disallow tail call optimization when a calling routine may have omitted character lenghts.
fcheck-array-temporaries fcheck-array-temporaries
Fortran Fortran
Produce a warning at runtime if a array temporary has been created for a procedure argument. Produce a warning at runtime if a array temporary has been created for a procedure argument.
......
...@@ -2516,7 +2516,11 @@ create_function_arglist (gfc_symbol * sym) ...@@ -2516,7 +2516,11 @@ create_function_arglist (gfc_symbol * sym)
DECL_ARG_TYPE (length) = len_type; DECL_ARG_TYPE (length) = len_type;
TREE_READONLY (length) = 1; TREE_READONLY (length) = 1;
gfc_finish_decl (length); gfc_finish_decl (length);
if (f->sym->ts.u.cl
/* Marking the length DECL_HIDDEN_STRING_LENGTH will lead
to tail calls being disabled. Only do that if we
potentially have broken callers. */
if (flag_broken_callers && f->sym->ts.u.cl
&& f->sym->ts.u.cl->length && f->sym->ts.u.cl->length
&& f->sym->ts.u.cl->length->expr_type == EXPR_CONSTANT) && f->sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
DECL_HIDDEN_STRING_LENGTH (length) = 1; DECL_HIDDEN_STRING_LENGTH (length) = 1;
......
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