diff mbox

Fix PR46796

Message ID alpine.LNX.2.00.1112091322120.4527@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Dec. 9, 2011, 12:29 p.m. UTC
This fixes PR46796 by making sure the types in the type variant chain
can be looked up again using get_qualified_type.

LTO bootstrap and regtest running on x86_64-unknown-linux-gnu.

Richard.

2011-12-09  Richard Guenther  <rguenther@suse.de>

	PR lto/46796
	* lto.c (uniquify_nodes): Merge TYPE_DECLs in the
	type variant chain.
diff mbox

Patch

Index: gcc/lto/lto.c
===================================================================
--- gcc/lto/lto.c	(revision 182154)
+++ gcc/lto/lto.c	(working copy)
@@ -860,6 +860,34 @@  uniquify_nodes (struct data_in *data_in,
       if (t == NULL_TREE)
 	continue;
 
+      /* Perform very simple TYPE_DECL merging on the type variant
+	 chain here.  That catches the cases in PR46796, where
+	 get_qualified_type fails to lookup an existing qualified
+	 type because TYPE_NAME are not pointer-equal.  */
+      if (TYPE_P (t)
+	  && TYPE_NAME (t)
+	  && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL)
+	{
+	  tree tn = TYPE_NAME (t);
+	  tree t2;
+	  for (t2 = TYPE_MAIN_VARIANT (t); t2; t2 = TYPE_NEXT_VARIANT (t2))
+	    {
+	      tree t2n = TYPE_NAME (t2);
+	      if (t2 == t
+		  || t2n == tn)
+		continue;
+	      if (t2n
+		  && TREE_CODE (t2n) == TYPE_DECL
+		  && TREE_TYPE (t2n) == TREE_TYPE (tn)
+		  && DECL_NAME (t2n) == DECL_NAME (tn)
+		  && DECL_SOURCE_LOCATION (t2n) == DECL_SOURCE_LOCATION (tn))
+		{
+		  TYPE_NAME (t) = t2n;
+		  break;
+		}
+	    }
+	}
+
       if (TREE_CODE (t) == VAR_DECL)
 	lto_register_var_decl_in_symtab (data_in, t);
       else if (TREE_CODE (t) == FUNCTION_DECL && !DECL_BUILT_IN (t))