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]

Fix ipa-comdats WRT thunks


Hi,
this patch fixes ICE when buliding chromium with LTO and on ipa-pure-const
patch.  The patch exposes semi-latent bug in ipa-comdats that is trying to
separate thunk from its target into different sections.  This will lead
to unrecognized insns at PPC and others that do not support tail call across
comdat sections.  Fixed thus.

Bootstrapped/regtested x86_64-linux, will commit it later today.

	PR ipa/65502
	* ipa-comdats.c (enqueue_references): Walk through thunks.
	(ipa_comdats): Likewise.
	(set_comdat_group_1): New function.
Index: ipa-comdats.c
===================================================================
--- ipa-comdats.c	(revision 221568)
+++ ipa-comdats.c	(working copy)
@@ -182,6 +182,10 @@ enqueue_references (symtab_node **first,
   for (i = 0; symbol->iterate_reference (i, ref); i++)
     {
       symtab_node *node = ref->referred->ultimate_alias_target ();
+
+      /* Always keep thunks in same sections as target function.  */
+      if (is_a <cgraph_node *>(node))
+	node = dyn_cast <cgraph_node *> (node)->function_symbol ();
       if (!node->aux && node->definition)
 	{
 	   node->aux = *first;
@@ -199,6 +203,10 @@ enqueue_references (symtab_node **first,
 	else
 	  {
 	    symtab_node *node = edge->callee->ultimate_alias_target ();
+
+	    /* Always keep thunks in same sections as target function.  */
+	    if (is_a <cgraph_node *>(node))
+	      node = dyn_cast <cgraph_node *> (node)->function_symbol ();
 	    if (!node->aux && node->definition)
 	      {
 		 node->aux = *first;
@@ -209,7 +217,7 @@ enqueue_references (symtab_node **first,
 }
 
 /* Set comdat group of SYMBOL to GROUP.
-   Callback for symtab_for_node_and_aliases.  */
+   Callback for for_node_and_aliases.  */
 
 bool
 set_comdat_group (symtab_node *symbol,
@@ -223,6 +231,16 @@ set_comdat_group (symtab_node *symbol,
   return false;
 }
 
+/* Set comdat group of SYMBOL to GROUP.
+   Callback for for_node_thunks_and_aliases.  */
+
+bool
+set_comdat_group_1 (cgraph_node *symbol,
+		    void *head_p)
+{
+  return set_comdat_group (symbol, head_p);
+}
+
 /* The actual pass with the main dataflow loop.  */
 
 static unsigned int
@@ -263,7 +281,12 @@ ipa_comdats (void)
 		 && (DECL_STATIC_CONSTRUCTOR (symbol->decl)
 		     || DECL_STATIC_DESTRUCTOR (symbol->decl))))
       {
-	map.put (symbol->ultimate_alias_target (), error_mark_node);
+	symtab_node *target = symbol->ultimate_alias_target ();
+
+	/* Always keep thunks in same sections as target function.  */
+	if (is_a <cgraph_node *>(target))
+	  target = dyn_cast <cgraph_node *> (target)->function_symbol ();
+	map.put (target, error_mark_node);
 
 	/* Mark the symbol so we won't waste time visiting it for dataflow.  */
 	symbol->aux = (symtab_node *) (void *) 1;
@@ -332,10 +355,8 @@ ipa_comdats (void)
       symbol->aux = NULL; 
       if (!symbol->get_comdat_group ()
 	  && !symbol->alias
-	  /* Thunks to external functions do not need to be categorized.  */
 	  && (!(fun = dyn_cast <cgraph_node *> (symbol))
-	      || !fun->thunk.thunk_p
-	      || fun->function_symbol ()->definition)
+	      || !fun->thunk.thunk_p)
 	  && symbol->real_symbol_p ())
 	{
 	  tree *val = map.get (symbol);
@@ -355,9 +376,16 @@ ipa_comdats (void)
 	      symbol->dump (dump_file);
 	      fprintf (dump_file, "To group: %s\n", IDENTIFIER_POINTER (group));
 	    }
-	  symbol->call_for_symbol_and_aliases (set_comdat_group,
-					     *comdat_head_map.get (group),
-					     true);
+	  if (is_a <cgraph_node *> (symbol))
+	   dyn_cast <cgraph_node *>(symbol)->call_for_symbol_and_aliases
+		  (set_comdat_group_1,
+		   *comdat_head_map.get (group),
+		   true);
+	  else
+	   symbol->call_for_symbol_and_aliases
+		  (set_comdat_group,
+		   *comdat_head_map.get (group),
+		   true);
 	}
     }
   return 0;


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