Commit 1d528e29 by Richard Henderson Committed by Richard Henderson

call.c (build_over_call): Use __builtin_memcpy for copying CLASS_AS_BASE rather than funny casting.

        * call.c (build_over_call): Use __builtin_memcpy for copying
        CLASS_AS_BASE rather than funny casting.

From-SVN: r83928
parent 9117ccad
2004-06-30 Richard Henderson <rth@redhat.com> 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 * init.c (build_new_1): Fill in TYPE_DOMAIN, TYPE_SIZE and
TYPE_SIZE_UNIT of full_type. TYPE_SIZE_UNIT of full_type.
......
...@@ -4795,31 +4795,28 @@ build_over_call (struct z_candidate *cand, int flags) ...@@ -4795,31 +4795,28 @@ build_over_call (struct z_candidate *cand, int flags)
tree type = TREE_TYPE (to); tree type = TREE_TYPE (to);
tree as_base = CLASSTYPE_AS_BASE (type); 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))) if (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (as_base)))
{
arg = build_indirect_ref (arg, 0);
val = build (MODIFY_EXPR, TREE_TYPE (to), to, arg); val = build (MODIFY_EXPR, TREE_TYPE (to), to, arg);
}
else else
{ {
/* We must only copy the non-tail padding parts. Use /* We must only copy the non-tail padding parts.
CLASSTYPE_AS_BASE for the bitwise copy. */ Use __builtin_memcpy 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); tree args, t;
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); 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);
val = build (MODIFY_EXPR, as_base, to_as_base, arg_as_base); t = convert (TREE_TYPE (TREE_VALUE (args)), t);
val = convert_to_void (val, NULL); val = build_indirect_ref (t, 0);
val = build (COMPOUND_EXPR, type, val, save_to);
TREE_NO_WARNING (val) = 1;
} }
return val; return val;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment