Fix handling of TYPE_USER_ALIGN

Message ID 20181109090008.v7mxj5dp2gnu5tzb@kam.mff.cuni.cz
State New
Headers show
Series
  • Fix handling of TYPE_USER_ALIGN
Related show

Commit Message

Jan Hubicka Nov. 9, 2018, 9 a.m.
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?

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.

Comments

Richard Biener Nov. 9, 2018, 9:05 a.m. | #1
On November 9, 2018 10:00:08 AM GMT+01:00, Jan Hubicka <hubicka@ucw.cz> 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;

Patch

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;