C++ ABI change: destroy value arguments in caller.
authorJason Merrill <jason@redhat.com>
Tue, 18 Dec 2001 13:30:30 +0000 (08:30 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 18 Dec 2001 13:30:30 +0000 (08:30 -0500)
        * 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

gcc/ChangeLog
gcc/calls.c
gcc/cp/ChangeLog
gcc/cp/NEWS
gcc/cp/decl.c
gcc/cp/semantics.c

index 128ea03f62c0ffcab8cc90b6f0b79d8cbb45464e..c973087acbe987c7ede7d80a6d423407cb673a68 100644 (file)
@@ -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.
index 6a228201f8f9a7314823c241ded89dedc693129c..afb9b39971d9d78fa02697c8f2d9a94dada6751b 100644 (file)
@@ -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
index db56ae1c79c05fabbdd206525be706d08636aacf..956df9949d9ff85751d2ac57689e60c252d6aae3 100644 (file)
@@ -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'.
index 1790882cfcf54d4e3e6bc8a75f7feefde83bb590..a55b484491a113bbd5215641b0f70667c8427287 100644 (file)
   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.
index d535097a299e4b5dbd52c3c7497abe81c7e34961..9cb605f198fea1e41dff2d291ba5b3ab8bd31e81 100644 (file)
@@ -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
index e2081b57a14f06ca2b57edfbaaca648ecb012b04..90120ce0fa61dbd76056c915e1de905db27bcf28 100644 (file)
@@ -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