Make some comdats implicitly hidden

Jan Hubicka hubicka@ucw.cz
Mon Aug 26 20:50:00 GMT 2013


Hi,
for -flto (and for -fhwhole-program as well) I for a while privatize comdat
symbols based on fact that I know their address can not be compared for
equivality (virtuals/ctors/dtors and functions with no address taken).

While analyzing the relocations of libreoffice I noticed that I can play
the same game w/o LTO at linker level.  Making those symbols hidden truns
external relocations to internal and should improve runtime, too: comdat
sharing by dynamic linker is expensive and won't save duplicated functions
from the binary.

There is ext/visibility/template2.C that fails with the patch. It tests that
visibility pragma does not bring the symbol local, but now we do so based
on logic above.

Jason, do you have any idea how to fix the testcase? I tried to use different
visility but that doesn't work, since we do not have corresponding scan-not-*

Bootstrapped/regtested x86_64-linux

Honza

	* ipa.c (function_and_variable_visibility): Make comdats that can be
	unshared hidden.
Index: ipa.c
===================================================================
--- ipa.c	(revision 202001)
+++ ipa.c	(working copy)
@@ -873,6 +873,17 @@ function_and_variable_visibility (bool w
 	       segfault though. */
 	    symtab_dissolve_same_comdat_group_list ((symtab_node) node);
 	}
+      if (node->symbol.externally_visible
+          && DECL_COMDAT (node->symbol.decl)
+	  && comdat_can_be_unshared_p ((symtab_node) node))
+	{
+	  if (dump_file
+	      && DECL_VISIBILITY (node->symbol.decl) != VISIBILITY_HIDDEN)
+	    fprintf (dump_file, "Promoting visibility to hidden: %s/%i\n",
+		     cgraph_node_name (node), node->symbol.order);
+	  DECL_VISIBILITY (node->symbol.decl) = VISIBILITY_HIDDEN;
+	  DECL_VISIBILITY_SPECIFIED (node->symbol.decl) = true;
+	}
 
       if (node->thunk.thunk_p
 	  && TREE_PUBLIC (node->symbol.decl))
@@ -980,6 +991,17 @@ function_and_variable_visibility (bool w
 	    symtab_dissolve_same_comdat_group_list ((symtab_node) vnode);
 	  vnode->symbol.resolution = LDPR_PREVAILING_DEF_IRONLY;
 	}
+      if (vnode->symbol.externally_visible
+          && DECL_COMDAT (vnode->symbol.decl)
+	  && comdat_can_be_unshared_p ((symtab_node) vnode))
+	{
+	  if (dump_file
+	      && DECL_VISIBILITY (vnode->symbol.decl) == VISIBILITY_HIDDEN)
+	    fprintf (dump_file, "Promoting visibility to hidden: %s/%i\n",
+		     varpool_node_name (vnode), vnode->symbol.order);
+	  DECL_VISIBILITY (vnode->symbol.decl) = VISIBILITY_HIDDEN;
+	  DECL_VISIBILITY_SPECIFIED (vnode->symbol.decl) = true;
+	}
     }
 
   if (dump_file)



More information about the Gcc-patches mailing list