call.c (build_over_call): Use __builtin_memcpy for copying CLASS_AS_BASE rather than...
authorRichard Henderson <rth@redhat.com>
Wed, 30 Jun 2004 20:01:29 +0000 (13:01 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 30 Jun 2004 20:01:29 +0000 (13:01 -0700)
        * call.c (build_over_call): Use __builtin_memcpy for copying
        CLASS_AS_BASE rather than funny casting.

From-SVN: r83928

gcc/cp/ChangeLog
gcc/cp/call.c

index 1c138dae2b2c8cf6659bb9d4b8a2e7dcad4776e1..b094bac93f0809f21dd0e510a2c855d98196292e 100644 (file)
@@ -1,3 +1,8 @@
+2004-06-30  Richard Henderson  <rth@redhat.com>
+
+       * call.c (build_over_call): Use __builtin_memcpy for copying
+       CLASS_AS_BASE rather than funny casting.
+
 2004-06-30  Richard Henderson  <rth@redhat.com>
 
        * init.c (build_new_1): Fill in TYPE_DOMAIN, TYPE_SIZE and
index 207d7585f8806f568b88068c43209732c6dbfcbc..99603ea3eaaf8aee530b4c35e2ab9710d8ccab2d 100644 (file)
@@ -4795,31 +4795,28 @@ build_over_call (struct z_candidate *cand, int flags)
       tree type = TREE_TYPE (to);
       tree as_base = CLASSTYPE_AS_BASE (type);
 
-      arg = build_indirect_ref (TREE_VALUE (TREE_CHAIN (converted_args)), 0);
+      arg = TREE_VALUE (TREE_CHAIN (converted_args));
       if (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (as_base)))
-       val = build (MODIFY_EXPR, TREE_TYPE (to), to, arg);
+       {
+         arg = build_indirect_ref (arg, 0);
+         val = build (MODIFY_EXPR, TREE_TYPE (to), to, arg);
+       }
       else
        {
-         /* We must only copy the non-tail padding parts. Use
-            CLASSTYPE_AS_BASE for the bitwise copy.  */
-         tree to_ptr, arg_ptr, to_as_base, arg_as_base, base_ptr_type;
-         tree save_to;
-
-         to_ptr = save_expr (build_unary_op (ADDR_EXPR, to, 0));
-         arg_ptr = build_unary_op (ADDR_EXPR, arg, 0);
-
-         base_ptr_type = build_pointer_type (as_base);
-         to_as_base = build_nop (base_ptr_type, to_ptr);
-         to_as_base = build_indirect_ref (to_as_base, 0);
-         arg_as_base = build_nop (base_ptr_type, arg_ptr);
-         arg_as_base = build_indirect_ref (arg_as_base, 0);
-
-         save_to = build_indirect_ref (to_ptr, 0);
-
-         val = build (MODIFY_EXPR, as_base, to_as_base, arg_as_base);
-         val = convert_to_void (val, NULL);
-         val = build (COMPOUND_EXPR, type, val, save_to);
-         TREE_NO_WARNING (val) = 1;
+         /* We must only copy the non-tail padding parts.
+            Use __builtin_memcpy for the bitwise copy.  */
+
+         tree args, t;
+
+         args = tree_cons (NULL, TYPE_SIZE_UNIT (as_base), NULL);
+         args = tree_cons (NULL, arg, args);
+         t = build_unary_op (ADDR_EXPR, to, 0);
+         args = tree_cons (NULL, t, args);
+         t = implicit_built_in_decls[BUILT_IN_MEMCPY];
+         t = build_call (t, args);
+
+         t = convert (TREE_TYPE (TREE_VALUE (args)), t);
+         val = build_indirect_ref (t, 0);
        }
       
       return val;