Patchwork Fix LTO support for compound literals

login
register
mail settings
Submitter Jan Hubicka
Date June 13, 2013, 10:18 a.m.
Message ID <20130613101802.GG24302@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/251034/
State New
Headers show

Comments

Jan Hubicka - June 13, 2013, 10:18 a.m.
Hi,
compount literals are constructed COMDAT but not PUBLIC by C frontned.
A while ago I discussed with with Jason? (I believe) and the reason for that
is that they allow sharing even if it is not done by linker.
This however breaks our partitioning code that assumes that COMDAT is always
exported. This patch sives it and fixes one of two problems seen while linking
Linux kernel.

Bootstrapped/regtested x86_64-linux, comitted.

Honza

	* ipa.c (cgraph_externally_visible_p, varpool_externally_visible_p):
	Local comdats are not externally visible.
	* symtab.c (dump_symtab_base): Dump externally visible.
	(verify_symtab_base): Verify back links in the symtab hash.

Patch

Index: ipa.c
===================================================================
--- ipa.c	(revision 200016)
+++ ipa.c	(working copy)
@@ -606,9 +606,8 @@  cgraph_externally_visible_p (struct cgra
 {
   if (!node->symbol.definition)
     return false;
-  if (!DECL_COMDAT (node->symbol.decl)
-      && (!TREE_PUBLIC (node->symbol.decl)
-	  || DECL_EXTERNAL (node->symbol.decl)))
+  if (!TREE_PUBLIC (node->symbol.decl)
+      || DECL_EXTERNAL (node->symbol.decl))
     return false;
 
   /* Do not try to localize built-in functions yet.  One of problems is that we
@@ -667,7 +666,7 @@  varpool_externally_visible_p (struct var
   if (DECL_EXTERNAL (vnode->symbol.decl))
     return true;
 
-  if (!DECL_COMDAT (vnode->symbol.decl) && !TREE_PUBLIC (vnode->symbol.decl))
+  if (!TREE_PUBLIC (vnode->symbol.decl))
     return false;
 
   /* If linker counts on us, we must preserve the function.  */
Index: symtab.c
===================================================================
--- symtab.c	(revision 200018)
+++ symtab.c	(working copy)
@@ -508,6 +508,8 @@  dump_symtab_base (FILE *f, symtab_node n
     fprintf (f, " force_output");
   if (node->symbol.forced_by_abi)
     fprintf (f, " forced_by_abi");
+  if (node->symbol.externally_visible)
+    fprintf (f, " externally_visible");
   if (node->symbol.resolution != LDPR_UNKNOWN)
     fprintf (f, " %s",
  	     ld_plugin_symbol_resolution_names[(int)node->symbol.resolution]);
@@ -655,6 +657,15 @@  verify_symtab_base (symtab_node node)
 	  error ("node not found in symtab decl hashtable");
 	  error_found = true;
 	}
+      if (hashed_node != node
+	  && (!is_a <cgraph_node> (node)
+	      || !dyn_cast <cgraph_node> (node)->clone_of
+	      || dyn_cast <cgraph_node> (node)->clone_of->symbol.decl
+		 != node->symbol.decl))
+	{
+	  error ("node differs from symtab decl hashtable");
+	  error_found = true;
+	}
     }
   if (assembler_name_hash)
     {