From 14688b8de389740f07079a945edf887a682fc9d1 Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Sun, 19 May 2019 08:22:41 +0000 Subject: [PATCH] re PR fortran/90329 (Incompatibility between gfortran and C lapack calls) 2019-05-19 Thomas Koenig 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 --- gcc/fortran/ChangeLog | 8 ++++++++ gcc/fortran/invoke.texi | 30 +++++++++++++++++++++++++++++- gcc/fortran/lang.opt | 4 ++++ gcc/fortran/trans-decl.c | 6 +++++- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f09e715353b..a8e188c6624 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2019-05-19 Thomas Koenig + + 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 PR fortran/89433 diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi index efc7aea588a..ec3b0405a07 100644 --- a/gcc/fortran/invoke.texi +++ b/gcc/fortran/invoke.texi @@ -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{} @gol -fcoarray=@var{} -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}. diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt index be722d7e183..80edc1171d7 100644 --- a/gcc/fortran/lang.opt +++ b/gcc/fortran/lang.opt @@ -397,6 +397,10 @@ fblas-matmul-limit= Fortran RejectNegative Joined UInteger Var(flag_blas_matmul_limit) Init(30) -fblas-matmul-limit= 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. diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 8420870a6b7..7cf1ec54289 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -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; -- 2.30.2