summaryrefslogtreecommitdiff
path: root/gcc/calls.c
diff options
context:
space:
mode:
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>2003-04-21 21:08:50 +0000
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>2003-04-21 21:08:50 +0000
commit4c4a1039ab8fa4fc34a09fc84c0fe85c6daf7125 (patch)
treea3f82160418feb45682cdb79d222ac7fd0af6ca7 /gcc/calls.c
parent601e16665d2dd92919e97e0c43abca94a713885a (diff)
downloadgcc-4c4a1039ab8fa4fc34a09fc84c0fe85c6daf7125.tar.gz
* calls.c (expand_call): Prevent sibcall optimization for calls to
nested subprograms. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65904 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/calls.c')
-rw-r--r--gcc/calls.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/calls.c b/gcc/calls.c
index 9b49f8719c2..06ed14a00e4 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -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