aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2001-12-18 08:30:30 -0500
committerJason Merrill <jason@gcc.gnu.org>2001-12-18 08:30:30 -0500
commitf21add0737d299427da125d7b89ecfe89b5e11db (patch)
treeedc5e296aa2480c6b58999dde1d72aa6a6e2b60f /gcc
parent769317c56d2321f57f3da95f444026e26f0e795c (diff)
downloadgcc-f21add0737d299427da125d7b89ecfe89b5e11db.zip
gcc-f21add0737d299427da125d7b89ecfe89b5e11db.tar.gz
gcc-f21add0737d299427da125d7b89ecfe89b5e11db.tar.bz2
C++ ABI change: destroy value arguments in caller.
* calls.c (initialize_argument_information): Pass the address of the TARGET_EXPR temporary rather than storing it into another. * semantics.c (genrtl_start_function, genrtl_finish_function): Don't create an extra binding level for the parameters. * decl.c (store_parm_decls): Don't do parameter cleanups. From-SVN: r48154
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/calls.c10
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/NEWS4
-rw-r--r--gcc/cp/decl.c20
-rw-r--r--gcc/cp/semantics.c3
6 files changed, 28 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 128ea03..c973087 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2001-12-18 Jason Merrill <jason@redhat.com>
+
+ C++ ABI change: destroy value arguments in caller.
+ * calls.c (initialize_argument_information): Pass the address of
+ the TARGET_EXPR temporary rather than storing it into another.
+
Tue Dec 18 07:09:06 2001 Douglas B. Rupp <rupp@gnat.com>
* config/alpha/xm-vms.h (INCLUDE_DEFAULTS): Add /gnu/include.
diff --git a/gcc/calls.c b/gcc/calls.c
index 6a22820..afb9b39 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -1212,6 +1212,16 @@ initialize_argument_information (num_actuals, args, args_size, n_named_args,
args[i].tree_value);
type = build_pointer_type (type);
}
+ else if (TREE_CODE (args[i].tree_value) == TARGET_EXPR)
+ {
+ /* In the V3 C++ ABI, parameters are destroyed in the caller.
+ We implement this by passing the address of the temporary
+ rather than expanding it into another allocated slot. */
+ args[i].tree_value = build1 (ADDR_EXPR,
+ build_pointer_type (type),
+ args[i].tree_value);
+ type = build_pointer_type (type);
+ }
else
{
/* We make a copy of the object and pass the address to the
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index db56ae1..956df99 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2001-12-18 Jason Merrill <jason@redhat.com>
+
+ C++ ABI change: destroy value arguments in caller.
+ * semantics.c (genrtl_start_function, genrtl_finish_function): Don't
+ create an extra binding level for the parameters.
+ * decl.c (store_parm_decls): Don't do parameter cleanups.
+
2001-12-18 Nathan Sidwell <nathan@codesourcery.com>
* call.c (build_new_method_call): Use '%#V'.
diff --git a/gcc/cp/NEWS b/gcc/cp/NEWS
index 1790882..a55b484 100644
--- a/gcc/cp/NEWS
+++ b/gcc/cp/NEWS
@@ -40,6 +40,10 @@
forms of `operator delete[]', and declared the two-argument form
before the one-argument form.
+* The C++ ABI has been changed so that when a parameter is passed by value,
+ any cleanup for that parameter is performed in the caller, as specified
+ by the ia64 C++ ABI, rather than the called function as before.
+
*** Changes in GCC 3.0:
* Support for guiding declarations has been removed.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index d535097..9cb605f 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -13790,7 +13790,6 @@ store_parm_decls (current_function_parms)
{
register tree fndecl = current_function_decl;
register tree parm;
- tree cleanups = NULL_TREE;
/* This is a chain of any other decls that came in among the parm
declarations. If a parm is declared with enum {foo, bar} x;
@@ -13821,20 +13820,11 @@ store_parm_decls (current_function_parms)
next = TREE_CHAIN (parm);
if (TREE_CODE (parm) == PARM_DECL)
{
- tree cleanup;
-
if (DECL_NAME (parm) == NULL_TREE
|| TREE_CODE (parm) != VOID_TYPE)
pushdecl (parm);
else
error ("parameter `%D' declared void", parm);
-
- cleanup = (processing_template_decl
- ? NULL_TREE
- : maybe_build_cleanup (parm));
-
- if (cleanup)
- cleanups = tree_cons (parm, cleanup, cleanups);
}
else
{
@@ -13860,16 +13850,6 @@ store_parm_decls (current_function_parms)
DECL_ARGUMENTS is not modified. */
storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl)));
- /* Now that we have initialized the parms, we can start their
- cleanups. We cannot do this before, since expand_decl_cleanup
- should not be called before the parm can be used. */
- while (cleanups)
- {
- finish_decl_cleanup (TREE_PURPOSE (cleanups),
- TREE_VALUE (cleanups));
- cleanups = TREE_CHAIN (cleanups);
- }
-
/* Do the starting of the exception specifications, if we have any. */
if (flag_exceptions && !processing_template_decl
&& flag_enforce_eh_specs
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index e2081b5..90120ce 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -2610,7 +2610,6 @@ genrtl_start_function (fn)
++function_depth;
/* Create a binding level for the parameters. */
- expand_start_bindings (2);
expand_function_start (fn, /*parms_have_cleanups=*/0);
/* If this function is `main'. */
if (DECL_MAIN_P (fn))
@@ -2667,7 +2666,7 @@ genrtl_finish_function (fn)
immediate_size_expand = 1;
/* Generate rtl for function exit. */
- expand_function_end (input_filename, lineno, 1);
+ expand_function_end (input_filename, lineno, 0);
/* If this is a nested function (like a template instantiation that
we're compiling in the midst of compiling something else), push a