ipa-visibility.c (localize_node): New function, broken out of ...
authorNathan Sidwell <nathan@acm.org>
Tue, 17 Jan 2017 15:04:50 +0000 (15:04 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 17 Jan 2017 15:04:50 +0000 (15:04 +0000)
* ipa-visibility.c (localize_node): New function, broken out of ...
(function_and_variable_visibility): ... here. Call it.

From-SVN: r244529

gcc/ChangeLog
gcc/ipa-visibility.c

index 5754ee2..43419be 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-17  Nathan Sidwell  <nathan@acm.org>
+
+       * ipa-visibility.c (localize_node): New function, broken out of ...
+       (function_and_variable_visibility): ... here. Call it.
+
 2017-01-17  Jan Hubicka  <hubicka@ucw.cz>
 
        PR middle-end/77445
index 299b3a6..de96b69 100644 (file)
@@ -529,6 +529,53 @@ optimize_weakref (symtab_node *node)
   gcc_assert (node->alias);
 }
 
+/* NODE is an externally visible definition, which we've discovered is
+   not needed externally.  Make it local to this compilation.  */
+
+static void
+localize_node (bool whole_program, symtab_node *node)
+{
+  gcc_assert (whole_program || in_lto_p || !TREE_PUBLIC (node->decl));
+
+  if (node->same_comdat_group && TREE_PUBLIC (node->decl))
+    {
+      for (symtab_node *next = node->same_comdat_group;
+          next != node; next = next->same_comdat_group)
+       {
+         next->set_comdat_group (NULL);
+         if (!next->alias)
+           next->set_section (NULL);
+         if (!next->transparent_alias)
+           next->make_decl_local ();
+         next->unique_name
+           |= ((next->resolution == LDPR_PREVAILING_DEF_IRONLY
+                || next->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
+               && TREE_PUBLIC (next->decl)
+               && !flag_incremental_link);
+       }
+
+      /* Now everything's localized, the grouping has no meaning, and
+        will cause crashes if we keep it around.  */
+      node->dissolve_same_comdat_group_list ();
+    }
+
+  node->unique_name
+    |= ((node->resolution == LDPR_PREVAILING_DEF_IRONLY
+        || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
+       && TREE_PUBLIC (node->decl)
+       && !flag_incremental_link);
+
+  if (TREE_PUBLIC (node->decl))
+    node->set_comdat_group (NULL);
+  if (DECL_COMDAT (node->decl) && !node->alias)
+    node->set_section (NULL);
+  if (!node->transparent_alias)
+    {
+      node->resolution = LDPR_PREVAILING_DEF_IRONLY;
+      node->make_decl_local ();
+    }
+}
+
 /* Decide on visibility of all symbols.  */
 
 static unsigned int
@@ -606,48 +653,7 @@ function_and_variable_visibility (bool whole_program)
       if (!node->externally_visible
          && node->definition && !node->weakref
          && !DECL_EXTERNAL (node->decl))
-       {
-         gcc_assert (whole_program || in_lto_p
-                     || !TREE_PUBLIC (node->decl));
-         node->unique_name
-           |= ((node->resolution == LDPR_PREVAILING_DEF_IRONLY
-                || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
-               && TREE_PUBLIC (node->decl)
-               && !flag_incremental_link);
-         node->resolution = LDPR_PREVAILING_DEF_IRONLY;
-         if (node->same_comdat_group && TREE_PUBLIC (node->decl))
-           {
-             symtab_node *next = node;
-
-             /* Set all members of comdat group local.  */
-             for (next = node->same_comdat_group;
-                  next != node;
-                  next = next->same_comdat_group)
-               {
-                 next->set_comdat_group (NULL);
-                 if (!next->alias)
-                   next->set_section (NULL);
-                 if (!next->transparent_alias)
-                   next->make_decl_local ();
-                 next->unique_name
-                   |= ((next->resolution == LDPR_PREVAILING_DEF_IRONLY
-                        || next->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
-                       && TREE_PUBLIC (next->decl)
-                       && !flag_incremental_link);
-               }
-             /* cgraph_externally_visible_p has already checked all
-                other nodes in the group and they will all be made
-                local.  We need to dissolve the group at once so that
-                the predicate does not segfault though. */
-             node->dissolve_same_comdat_group_list ();
-           }
-         if (TREE_PUBLIC (node->decl))
-           node->set_comdat_group (NULL);
-         if (DECL_COMDAT (node->decl) && !node->alias)
-           node->set_section (NULL);
-         if (!node->transparent_alias)
-           node->make_decl_local ();
-       }
+       localize_node (whole_program, node);
 
       if (node->thunk.thunk_p
          && !node->thunk.add_pointer_bounds_args
@@ -757,49 +763,11 @@ function_and_variable_visibility (bool whole_program)
       if (lookup_attribute ("no_reorder",
                            DECL_ATTRIBUTES (vnode->decl)))
        vnode->no_reorder = 1;
+
       if (!vnode->externally_visible
          && !vnode->transparent_alias)
-       {
-         gcc_assert (in_lto_p || whole_program || !TREE_PUBLIC (vnode->decl));
-         vnode->unique_name |= ((vnode->resolution == LDPR_PREVAILING_DEF_IRONLY
-                                 || vnode->resolution
-                                     == LDPR_PREVAILING_DEF_IRONLY_EXP)
-                                && TREE_PUBLIC (vnode->decl)
-                                && !flag_incremental_link);
-         if (vnode->same_comdat_group && TREE_PUBLIC (vnode->decl))
-           {
-             symtab_node *next = vnode;
+       localize_node (whole_program, vnode);
 
-             /* Set all members of comdat group local.  */
-             if (vnode->same_comdat_group)
-               for (next = vnode->same_comdat_group;
-                    next != vnode;
-                    next = next->same_comdat_group)
-               {
-                 next->set_comdat_group (NULL);
-                 if (!next->alias)
-                   next->set_section (NULL);
-                 if (!next->transparent_alias)
-                   {
-                     next->make_decl_local ();
-                     next->unique_name |= ((next->resolution == LDPR_PREVAILING_DEF_IRONLY
-                                            || next->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
-                                           && TREE_PUBLIC (next->decl)
-                                           && !flag_incremental_link);
-                   }
-               }
-             vnode->dissolve_same_comdat_group_list ();
-           }
-         if (TREE_PUBLIC (vnode->decl))
-           vnode->set_comdat_group (NULL);
-         if (DECL_COMDAT (vnode->decl) && !vnode->alias)
-           vnode->set_section (NULL);
-         if (!vnode->transparent_alias)
-           {
-             vnode->make_decl_local ();
-             vnode->resolution = LDPR_PREVAILING_DEF_IRONLY;
-           }
-       }
       update_visibility_by_resolution_info (vnode);
 
       /* Update virtual tables to point to local aliases where possible.  */