On November 9, 2018 10:00:08 AM GMT+01:00, Jan Hubicka <[email protected]> wrote:
>Hi,
>this patch fixes handling of TYPE_USER_ALIGN. I tried to drop it
>completely from LTO streaming and clear it in free lang data but it
>breaks one ubsan testcase:
>
>FAIL: c-c++-common/ubsan/pr63802.c -O2 -flto -fno-use-linker-plugin
>-flto-partition=none output pattern test
>FAIL: c-c++-common/ubsan/pr63802.c -O2 -flto -fuse-linker-plugin
>-fno-fat-lto-objects output pattern test
>
>lto-bootstrapped/regtested x86_64-linux, OK?
OK.
Richard.
>Honza
>
> * tree.c (fld_type_variant_equal_p): Test user align flag.
> (flt_type_variant): Copy user align flag.
> (fld_incomplete_type_of): Clear it.
>Index: tree.c
>===================================================================
>--- tree.c (revision 265914)
>+++ tree.c (working copy)
>@@ -5109,7 +5109,8 @@ fld_type_variant_equal_p (tree t, tree v
> /* We want to match incomplete variants with complete types.
> In this case we need to ignore alignment. */
> || ((!RECORD_OR_UNION_TYPE_P (t) || COMPLETE_TYPE_P (v))
>- && TYPE_ALIGN (t) != TYPE_ALIGN (v))
>+ && (TYPE_ALIGN (t) != TYPE_ALIGN (v)
>+ || TYPE_USER_ALIGN (t) != TYPE_USER_ALIGN (v)))
> || fld_simplified_type_name (t) != fld_simplified_type_name (v)
> || !attribute_list_equal (TYPE_ATTRIBUTES (t),
> TYPE_ATTRIBUTES (v)))
>@@ -5140,7 +5141,10 @@ fld_type_variant (tree first, tree t, st
> /* Variants of incomplete types should have alignment
> set to BITS_PER_UNIT. Do not copy the actual alignment. */
> if (!RECORD_OR_UNION_TYPE_P (v) || COMPLETE_TYPE_P (v))
>- SET_TYPE_ALIGN (v, TYPE_ALIGN (t));
>+ {
>+ SET_TYPE_ALIGN (v, TYPE_ALIGN (t));
>+ TYPE_USER_ALIGN (v) = TYPE_USER_ALIGN (t);
>+ }
> gcc_checking_assert (fld_type_variant_equal_p (t,v));
> add_tree_to_fld_list (v, fld);
> return v;
>@@ -5194,6 +5198,7 @@ fld_incomplete_type_of (tree t, struct f
> TYPE_SIZE (copy) = NULL;
> SET_TYPE_MODE (copy, VOIDmode);
> SET_TYPE_ALIGN (copy, BITS_PER_UNIT);
>+ TYPE_USER_ALIGN (copy) = 0;
> TYPE_SIZE_UNIT (copy) = NULL;
> TYPE_CANONICAL (copy) = TYPE_CANONICAL (t);
> TYPE_TYPELESS_STORAGE (copy) = 0;