Patchwork Fix dealII LTO link error

login
register
mail settings
Submitter Jan Hubicka
Date June 14, 2011, 12:50 p.m.
Message ID <20110614125041.GB16995@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/100323/
State New
Headers show

Comments

Jan Hubicka - June 14, 2011, 12:50 p.m.
Hi,
this patch solves problem with DealII and WHOPR.  The code to handle comdat groups was written
with assumption that everything in the group is COMDAT that is not always true.

Bootstrapped/regtested x86_64-linux, comitted.

Honza

	* cgraph.c (cgraph_make_decl_local): Handle DECL_ONE_ONLY
	similarly to DECL_COMDAT.
	* cgraphunit.c (cgraph_analyze_function): Likewise.
	* ipa.c (function_and_variable_visibility): Likewise.

Patch

Index: cgraph.c
===================================================================
--- cgraph.c	(revision 175001)
+++ cgraph.c	(working copy)
@@ -2487,7 +2487,7 @@  cgraph_make_decl_local (tree decl)
     DECL_COMMON (decl) = 0;
   else gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
 
-  if (DECL_COMDAT (decl))
+  if (DECL_ONE_ONLY (decl) || DECL_COMDAT (decl))
     {
       /* It is possible that we are linking against library defining same COMDAT
 	 function.  To avoid conflict we need to rename our local name of the
Index: cgraphunit.c
===================================================================
--- cgraphunit.c	(revision 175001)
+++ cgraphunit.c	(working copy)
@@ -830,9 +830,9 @@  cgraph_analyze_function (struct cgraph_n
       if (TREE_PUBLIC (node->decl) && node->same_body_alias)
 	{
           DECL_EXTERNAL (node->decl) = DECL_EXTERNAL (node->thunk.alias);
-	  if (DECL_COMDAT (node->thunk.alias))
+	  if (DECL_ONE_ONLY (node->thunk.alias))
 	    {
-	      DECL_COMDAT (node->decl) = 1;
+	      DECL_COMDAT (node->decl) = DECL_COMDAT (node->thunk.alias);
 	      DECL_COMDAT_GROUP (node->decl) = DECL_COMDAT_GROUP (node->thunk.alias);
 	      if (DECL_ONE_ONLY (node->thunk.alias) && !node->same_comdat_group)
 		{
Index: ipa.c
===================================================================
--- ipa.c	(revision 175001)
+++ ipa.c	(working copy)
@@ -904,9 +904,9 @@  function_and_variable_visibility (bool w
 
 	     We also need to arrange the thunk into the same comdat group as
 	     the function it reffers to.  */
-	  if (DECL_COMDAT (decl_node->decl))
+	  if (DECL_ONE_ONLY (decl_node->decl))
 	    {
-	      DECL_COMDAT (node->decl) = 1;
+	      DECL_COMDAT (node->decl) = DECL_COMDAT (decl_node->decl);
 	      DECL_COMDAT_GROUP (node->decl) = DECL_COMDAT_GROUP (decl_node->decl);
 	      if (DECL_ONE_ONLY (decl_node->decl) && !node->same_comdat_group)
 		{