aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@redhat.com>2004-05-22 10:43:56 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2004-05-22 10:43:56 +0000
commit9fd47435098270dd5687b9bbaa34d1b9ecb494e7 (patch)
treebf82bc4a8519356b69f3a76b5b2f664864fc4a47
parentfea6ecb7464fd19e3981a6297a30ecc7981de4b2 (diff)
downloadgcc-9fd47435098270dd5687b9bbaa34d1b9ecb494e7.zip
gcc-9fd47435098270dd5687b9bbaa34d1b9ecb494e7.tar.gz
gcc-9fd47435098270dd5687b9bbaa34d1b9ecb494e7.tar.bz2
calls.c (initialize_argument_information): Forbid sibcalls if a callee-copied argument is stored in the current function's...
* calls.c (initialize_argument_information): Forbid sibcalls if a callee-copied argument is stored in the current function's frame. From-SVN: r82129
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/calls.c7
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);