diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/calls.c | 7 |
2 files changed, 12 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c455e6..a01a108 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-05-22 Richard Sandiford <rsandifo@redhat.com> + + * calls.c (initialize_argument_information): Forbid sibcalls if a + callee-copied argument is stored in the current function's frame. + 2004-05-22 Eric Christopher <echristo@redhat.com> * fix-header.c (read_scan_file): Update for add_path change. diff --git a/gcc/calls.c b/gcc/calls.c index 419f458..48d62f8 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1129,6 +1129,13 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED, && ! REG_P (DECL_RTL (TREE_OPERAND (args[i].tree_value, 1)))) args[i].tree_value = TREE_OPERAND (args[i].tree_value, 1); + /* We can't use sibcalls if a callee-copied argument is stored + in the current function's frame. */ + if (!call_from_thunk_p + && (!DECL_P (args[i].tree_value) + || !TREE_STATIC (args[i].tree_value))) + *may_tailcall = false; + args[i].tree_value = build1 (ADDR_EXPR, build_pointer_type (type), args[i].tree_value); |