]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/90329 (Incompatibility between gfortran and C lapack calls)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 19 May 2019 08:22:41 +0000 (08:22 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 19 May 2019 08:22:41 +0000 (08:22 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/invoke.texi
gcc/fortran/lang.opt
gcc/fortran/trans-decl.c

index f09e715353bd935fcbe2fb064c1ebdb50a389b36..a8e188c66247d35b9560962764f4e9efbd4d9270 100644 (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
index efc7aea588a9f09554563e453aa406fb891ddfda..ec3b0405a078333a37b806efa581e134ccf9e63c 100644 (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}.
index be722d7e18363be6f5fa942d85bba01a213d1d74..80edc1171d712d618efd05059e7a194660430c74 100644 (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.
index 8420870a6b782c9702ef9e45291d4b2789c1558a..7cf1ec5428910425808d63c502ccac060600e9f0 100644 (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;