OSDN Git Service

* calls.c (expand_call): Prevent sibcall optimization for calls to
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 Apr 2003 21:08:50 +0000 (21:08 +0000)
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 Apr 2003 21:08:50 +0000 (21:08 +0000)
nested subprograms.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65904 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/calls.c

index b27996f..decc4b1 100644 (file)
@@ -1,3 +1,8 @@
+2003-04-21  Olivier Hainque  <hainque@act-europe.fr>
+
+       * calls.c (expand_call): Prevent sibcall optimization for calls to
+       nested subprograms.
+
 2003-04-21  Joel Brobecker  <brobecker@gnat.com>
 
        * dwarf2out.c (is_ada, is_ada_subrange_type): New functions.
index 9b49f87..06ed14a 100644 (file)
@@ -2515,6 +2515,10 @@ expand_call (exp, target, ignore)
          optimized.  */
       || (flags & (ECF_RETURNS_TWICE | ECF_LONGJMP | ECF_NORETURN))
       || TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (addr)))
+      /* If the called function is nested in the current one, it might access
+         some of the caller's arguments, but could clobber them beforehand if
+         the argument areas are shared.  */
+      || (fndecl && decl_function_context (fndecl) == current_function_decl)
       /* If this function requires more stack slots than the current
         function, we cannot change it into a sibling call.  */
       || args_size.constant > current_function_args_size