diff options
author | Jason Merrill <jason@redhat.com> | 2001-12-18 08:30:30 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2001-12-18 08:30:30 -0500 |
commit | f21add0737d299427da125d7b89ecfe89b5e11db (patch) | |
tree | edc5e296aa2480c6b58999dde1d72aa6a6e2b60f /gcc | |
parent | 769317c56d2321f57f3da95f444026e26f0e795c (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/calls.c | 10 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/NEWS | 4 | ||||
-rw-r--r-- | gcc/cp/decl.c | 20 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 3 |
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 |