re PR ipa/65502 (pure-const should play well with clobbers.)
authorJan Hubicka <hubicka@ucw.cz>
Sun, 22 Mar 2015 21:10:24 +0000 (22:10 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sun, 22 Mar 2015 21:10:24 +0000 (21:10 +0000)
PR ipa/65502
* ipa-comdats.c (enqueue_references): Walk through thunks.
(ipa_comdats): Likewise.
(set_comdat_group_1): New function.

From-SVN: r221574

gcc/ChangeLog
gcc/ipa-comdats.c

index e2649206fe46d429aaaaff5445d9d0074124aa1c..44eaf45415c3b9131ee4cee96f0e95ca19d361a3 100644 (file)
@@ -1,3 +1,10 @@
+2015-03-20  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/65502
+       * ipa-comdats.c (enqueue_references): Walk through thunks.
+       (ipa_comdats): Likewise.
+       (set_comdat_group_1): New function.
+
 2015-03-20  Jan Hubicka  <hubicka@ucw.cz>
 
        PR ipa/65475
index 9f43f299dbbff1f8359eb6c1b8c30100ff027389..f349f9f087ec61604e0493d45babd34b8e2d8a89 100644 (file)
@@ -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;