This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[4.2 PATCH]: backport patch for PRs 28834, 29436 & 32326, fixes mayalias-2.c.


This is a backport to gcc-4.2.x of Jason's patch for PRs 28834, 29436 &
32326 which fixes gcc.c-torture/execute/mayalias-2.c.  The patch has been
on mainline/4.3 for about four months.
http://gcc.gnu.org/ml/gcc-patches/2007-11/msg01029.html

I additionally delete the XFAIL of this testcase which only exists in 4.2.

Tested on x86_64-unknown-linux-gnu and i686-unknown-linux-gnu, no
regressions.

Okay for 4.2 branch?

		Thanks,
		--Kaveh


2008-03-12  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>

	Backport:
	2007-11-19  Jason Merrill  <jason@redhat.com>

	PR debug/28834, debug/29436, c/32326
	* tree.c (build_type_attribute_qual_variant): Refuse to make
	a distinct copy of a struct/enum type.  Use build_distinct_type_copy.
	* doc/extend.texi (Type Attributes): Don't encourage people to add
	attributes to struct/enum types in a typedef.  Fix
	transparent_union example.

	* tree-inline.c (remap_type_1): Remove code that's redundant with
	remap_type.
	(build_duplicate_type): Set id.copy_decl.
	* c-common.c (handle_transparent_union_attribute): Simplify logic.

	testsuite:
	* gcc.c-torture/execute/mayalias-2.c (struct S): Eliminate.
	* gcc.c-torture/execute/mayalias-2.x: Delete.


diff -rup orig/egcc-4.2-SVN20080312/gcc/c-common.c egcc-4.2-SVN20080312/gcc/c-common.c
--- orig/egcc-4.2-SVN20080312/gcc/c-common.c	2008-01-03 23:38:08.000000000 +0100
+++ egcc-4.2-SVN20080312/gcc/c-common.c	2008-03-12 15:45:38.000000000 +0100
@@ -4393,21 +4393,13 @@ handle_transparent_union_attribute (tree
 				    tree ARG_UNUSED (args), int flags,
 				    bool *no_add_attrs)
 {
-  tree type = NULL;
+  tree type;

   *no_add_attrs = true;

-  if (DECL_P (*node))
-    {
-      if (TREE_CODE (*node) != TYPE_DECL)
-	goto ignored;
-      node = &TREE_TYPE (*node);
-      type = *node;
-    }
-  else if (TYPE_P (*node))
-    type = *node;
-  else
-    goto ignored;
+  if (TREE_CODE (*node) == TYPE_DECL)
+    node = &TREE_TYPE (*node);
+  type = *node;

   if (TREE_CODE (type) == UNION_TYPE)
     {
diff -rup orig/egcc-4.2-SVN20080312/gcc/doc/extend.texi egcc-4.2-SVN20080312/gcc/doc/extend.texi
--- orig/egcc-4.2-SVN20080312/gcc/doc/extend.texi	2008-02-02 02:02:44.000000000 +0100
+++ egcc-4.2-SVN20080312/gcc/doc/extend.texi	2008-03-12 15:45:25.000000000 +0100
@@ -3481,8 +3481,9 @@ attributes in header files without being
 macro of the same name.  For example, you may use @code{__aligned__}
 instead of @code{aligned}.

-You may specify type attributes either in a @code{typedef} declaration
-or in an enum, struct or union type declaration or definition.
+You may specify type attributes in an enum, struct or union type
+declaration or definition, or for other types in a @code{typedef}
+declaration.

 For an enum, struct or union type, you may specify attributes either
 between the enum, struct or union tag and the name of the type, or
@@ -3641,11 +3642,11 @@ less useful.  Instead, @code{<sys/wait.h
 as follows:

 @smallexample
-typedef union
+typedef union __attribute__ ((__transparent_union__))
   @{
     int *__ip;
     union wait *__up;
-  @} wait_status_ptr_t __attribute__ ((__transparent_union__));
+  @} wait_status_ptr_t;

 pid_t wait (wait_status_ptr_t);
 @end smallexample
diff -rup orig/egcc-4.2-SVN20080312/gcc/testsuite/gcc.c-torture/execute/mayalias-2.c egcc-4.2-SVN20080312/gcc/testsuite/gcc.c-torture/execute/mayalias-2.c
--- orig/egcc-4.2-SVN20080312/gcc/testsuite/gcc.c-torture/execute/mayalias-2.c	2008-01-03 23:34:47.000000000 +0100
+++ egcc-4.2-SVN20080312/gcc/testsuite/gcc.c-torture/execute/mayalias-2.c	2008-03-12 15:45:25.000000000 +0100
@@ -1,5 +1,4 @@
-struct S { short x; };
-typedef struct S __attribute__((__may_alias__)) test;
+typedef struct __attribute__((__may_alias__)) { short x; } test;

 int f() {
   int a=10;
diff -rup orig/egcc-4.2-SVN20080312/gcc/tree-inline.c egcc-4.2-SVN20080312/gcc/tree-inline.c
--- orig/egcc-4.2-SVN20080312/gcc/tree-inline.c	2008-01-03 23:38:08.000000000 +0100
+++ egcc-4.2-SVN20080312/gcc/tree-inline.c	2008-03-12 15:49:11.000000000 +0100
@@ -196,24 +196,8 @@ remap_decl (tree decl, copy_body_data *i
 static tree
 remap_type_1 (tree type, copy_body_data *id)
 {
-  splay_tree_node node;
   tree new, t;

-  if (type == NULL)
-    return type;
-
-  /* See if we have remapped this type.  */
-  node = splay_tree_lookup (id->decl_map, (splay_tree_key) type);
-  if (node)
-    return (tree) node->value;
-
-  /* The type only needs remapping if it's variably modified.  */
-  if (! variably_modified_type_p (type, id->src_fn))
-    {
-      insert_decl_map (id, type, type);
-      return type;
-    }
-
   /* We do need a copy.  build and register it now.  If this is a pointer or
      reference type, remap the designated type and make a new pointer or
      reference type.  */
@@ -2900,6 +2884,7 @@ build_duplicate_type (tree type)
   id.dst_fn = current_function_decl;
   id.src_cfun = cfun;
   id.decl_map = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
+  id.copy_decl = copy_decl_no_change;

   type = remap_type_1 (type, &id);

diff -rup orig/egcc-4.2-SVN20080312/gcc/tree.c egcc-4.2-SVN20080312/gcc/tree.c
--- orig/egcc-4.2-SVN20080312/gcc/tree.c	2008-02-03 02:03:23.000000000 +0100
+++ egcc-4.2-SVN20080312/gcc/tree.c	2008-03-12 15:45:25.000000000 +0100
@@ -3371,15 +3371,26 @@ build_type_attribute_qual_variant (tree
       tree ntype;
       enum tree_code code = TREE_CODE (ttype);

-      ntype = copy_node (ttype);
+      /* Building a distinct copy of a tagged type is inappropriate; it
+	 causes breakage in code that expects there to be a one-to-one
+	 relationship between a struct and its fields.
+	 build_duplicate_type is another solution (as used in
+	 handle_transparent_union_attribute), but that doesn't play well
+	 with the stronger C++ type identity model.  */
+      if (TREE_CODE (ttype) == RECORD_TYPE
+	  || TREE_CODE (ttype) == UNION_TYPE
+	  || TREE_CODE (ttype) == QUAL_UNION_TYPE
+	  || TREE_CODE (ttype) == ENUMERAL_TYPE)
+	{
+	  warning (OPT_Wattributes,
+		   "ignoring attributes applied to %qT after definition",
+		   TYPE_MAIN_VARIANT (ttype));
+	  return build_qualified_type (ttype, quals);
+	}

-      TYPE_POINTER_TO (ntype) = 0;
-      TYPE_REFERENCE_TO (ntype) = 0;
-      TYPE_ATTRIBUTES (ntype) = attribute;
+      ntype = build_distinct_type_copy (ttype);

-      /* Create a new main variant of TYPE.  */
-      TYPE_MAIN_VARIANT (ntype) = ntype;
-      TYPE_NEXT_VARIANT (ntype) = 0;
+      TYPE_ATTRIBUTES (ntype) = attribute;
       set_type_quals (ntype, TYPE_UNQUALIFIED);

       hashcode = iterative_hash_object (code, hashcode);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]