ipa.c (symbol_table::remove_unreachable_nodes): Avoid releasing bodies of thunks...
authorJan Hubicka <hubicka@ucw.cz>
Wed, 11 Feb 2015 19:11:47 +0000 (20:11 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 11 Feb 2015 19:11:47 +0000 (19:11 +0000)
* ipa.c (symbol_table::remove_unreachable_nodes): Avoid releasing
bodies of thunks; comment on why.
* symtab.c (symtab_node::get_partitioning_class): Aliases of extern
symbols are extern.

From-SVN: r220630

gcc/ChangeLog
gcc/ipa.c
gcc/symtab.c

index 87bf089b7542127c9f91b038a7915e6d1c104a43..d8952092c436ac21a4a45fe2c3219b2fb9165c68 100644 (file)
@@ -1,3 +1,10 @@
+2015-02-11  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa.c (symbol_table::remove_unreachable_nodes): Avoid releasing
+       bodies of thunks; comment on why.
+       * symtab.c (symtab_node::get_partitioning_class): Aliases of extern
+       symbols are extern.
+
 2015-02-11  Richard Henderson  <rth@redhat.com>
 
        PR sanitize/65000
index 620431c54d6b1c2c7b86c877ab18aea3010daec9..58ba3097377f714705802040c7fa09485bd73e61 100644 (file)
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -537,7 +537,13 @@ symbol_table::remove_unreachable_nodes (FILE *file)
       /* If node is unreachable, remove its body.  */
       else if (!reachable.contains (node))
         {
-         if (!body_needed_for_clonning.contains (node->decl))
+         /* We keep definitions of thunks and aliases in the boundary so
+            we can walk to the ultimate alias targets and function symbols
+            reliably.  */
+         if (node->alias || node->thunk.thunk_p)
+           ;
+         else if (!body_needed_for_clonning.contains (node->decl)
+             && !node->alias && !node->thunk.thunk_p)
            node->release_body ();
          else if (!node->clone_of)
            gcc_assert (in_lto_p || DECL_RESULT (node->decl));
index 3bfb04a25c12474f0702e22e75c55633248bee34..3cdf62aeeded1dcf194363e85e77c0aca722b235 100644 (file)
@@ -1779,6 +1779,8 @@ symtab_node::get_partitioning_class (void)
 
   if (varpool_node *vnode = dyn_cast <varpool_node *> (this))
     {
+      if (alias && definition && !ultimate_alias_target ()->definition)
+       return SYMBOL_EXTERNAL;
       /* Constant pool references use local symbol names that can not
          be promoted global.  We should never put into a constant pool
          objects that can not be duplicated across partitions.  */
@@ -1790,7 +1792,7 @@ symtab_node::get_partitioning_class (void)
      Handle them as external; compute_ltrans_boundary take care to make
      proper things to happen (i.e. to make them appear in the boundary but
      with body streamed, so clone can me materialized).  */
-  else if (!dyn_cast <cgraph_node *> (this)->definition)
+  else if (!dyn_cast <cgraph_node *> (this)->function_symbol ()->definition)
     return SYMBOL_EXTERNAL;
 
   /* Linker discardable symbols are duplicated to every use unless they are