diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c455e6c3b4..a01a10851d0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-05-22 Richard Sandiford + + * 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 * fix-header.c (read_scan_file): Update for add_path change. diff --git a/gcc/calls.c b/gcc/calls.c index 419f45881a1..48d62f83e52 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);