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]

Make some comdats implicitly hidden


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)


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