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
This commit is contained in:
Thomas Koenig 2019-05-19 08:22:41 +00:00
parent f12b0a6226
commit 14688b8de3
4 changed files with 46 additions and 2 deletions

View file

@ -1,3 +1,11 @@
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>
PR fortran/89433

View file

@ -181,7 +181,7 @@ and warnings}.
@item Code Generation Options
@xref{Code Gen Options,,Options for code generation conventions}.
@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
-fcoarray=@var{<none|single|lib>} -fexternal-blas -ff2c
-ffrontend-loop-interchange @gol
@ -1617,6 +1617,34 @@ warnings for generated array temporaries.
@c Note: This option is also referred in gcc's manpage
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
@opindex @code{fcheck-array-temporaries}
Deprecated alias for @option{-fcheck=array-temps}.

View file

@ -397,6 +397,10 @@ fblas-matmul-limit=
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.
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
Fortran
Produce a warning at runtime if a array temporary has been created for a procedure argument.

View file

@ -2516,7 +2516,11 @@ create_function_arglist (gfc_symbol * sym)
DECL_ARG_TYPE (length) = len_type;
TREE_READONLY (length) = 1;
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->expr_type == EXPR_CONSTANT)
DECL_HIDDEN_STRING_LENGTH (length) = 1;