diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/calls.c | 6 |
2 files changed, 9 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fa80d37..c95cfd8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2003-04-19 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * calls.c (expand_call): Provide init for old_stack_pointer_delta. + 2003-04-19 Nathan Sidwell <nathan@codesourcery.com> * doc/invoke.texi (-fprofile-arcs): Mention -lgcov, locking and diff --git a/gcc/calls.c b/gcc/calls.c index 42e2bf7..ed92ce7 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -2212,7 +2212,7 @@ expand_call (exp, target, ignore) /* Some stack pointer alterations we make are performed via allocate_dynamic_stack_space. This modifies the stack_pointer_delta, which we then also need to save/restore along the way. */ - int old_stack_pointer_delta; + int old_stack_pointer_delta = 0; rtx call_fusage; tree p = TREE_OPERAND (exp, 0); @@ -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. */ + || 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 |