]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ipa.c (function_and_variable_visibility): Decompose DECL_ONE_ONLY groups when we...
authorJan Hubicka <hubicka@ucw.cz>
Tue, 4 Feb 2014 23:26:36 +0000 (00:26 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 4 Feb 2014 23:26:36 +0000 (23:26 +0000)
* ipa.c (function_and_variable_visibility): Decompose DECL_ONE_ONLY
groups when we know they are controlled by LTO.
* varasm.c (default_binds_local_p_1): If object is in other partition,
it will be resolved locally.

* lto-partition.c (get_symbol_class): Only unforced DECL_ONE_ONLY
needs duplicating, not generic COMDAT.

From-SVN: r207489

gcc/ChangeLog
gcc/ipa.c
gcc/lto/ChangeLog
gcc/lto/lto-partition.c
gcc/varasm.c

index 1d7a8fd5d07c32d5470e5b629ec36d9aa18f90ed..8d2e39444cce956b9bd07e02873ead6f34b6ef08 100644 (file)
@@ -1,3 +1,10 @@
+2014-02-04  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa.c (function_and_variable_visibility): Decompose DECL_ONE_ONLY
+       groups when we know they are controlled by LTO.
+       * varasm.c (default_binds_local_p_1): If object is in other partition,
+       it will be resolved locally.
+
 2014-02-04  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        * gcc/config/host-linux.c (linux_gt_pch_use_address): Don't
index a7e4d764786aa51ece3c34aeffa14076f9b6d5ef..be75cba2dfa36a6d942f0f2ef109c397390ba0b8 100644 (file)
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -1002,6 +1002,36 @@ function_and_variable_visibility (bool whole_program)
          if (DECL_EXTERNAL (decl_node->decl))
            DECL_EXTERNAL (node->decl) = 1;
        }
+
+      /* If whole comdat group is used only within LTO code, we can dissolve it,
+        we handle the unification ourselves.
+        We keep COMDAT and weak so visibility out of DSO does not change.
+        Later we may bring the symbols static if they are not exported.  */
+      if (DECL_ONE_ONLY (node->decl)
+         && (node->resolution == LDPR_PREVAILING_DEF_IRONLY
+             || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP))
+       {
+         symtab_node *next = node;
+
+         if (node->same_comdat_group)
+           for (next = node->same_comdat_group;
+                next != node;
+                next = next->same_comdat_group)
+             if (next->externally_visible
+                 && (next->resolution != LDPR_PREVAILING_DEF_IRONLY
+                     && next->resolution != LDPR_PREVAILING_DEF_IRONLY_EXP))
+               break;
+         if (node == next)
+           {
+             if (node->same_comdat_group)
+               for (next = node->same_comdat_group;
+                    next != node;
+                    next = next->same_comdat_group)
+                 DECL_COMDAT_GROUP (next->decl) = NULL;
+             DECL_COMDAT_GROUP (node->decl) = NULL;
+             symtab_dissolve_same_comdat_group_list (node);
+           }
+       }
     }
   FOR_EACH_DEFINED_FUNCTION (node)
     {
index 437e97e99f828fbc25000f64210a95d3c66f3eeb..0f9e6882b5fb6a03f9829824c53414de5044be59 100644 (file)
@@ -1,3 +1,8 @@
+2014-02-04  Jan Hubicka  <hubicka@ucw.cz>
+
+       * lto-partition.c (get_symbol_class): Only unforced DECL_ONE_ONLY 
+       needs duplicating, not generic COMDAT.
+
 2014-02-04  Richard Biener  <rguenther@suse.de>
 
        PR lto/59723
index 6b2d488ed090c7ebd7efd1d37f8e6169038e18c5..da76b10511f0660717144e12ec5e4d18069ef56a 100644 (file)
@@ -94,10 +94,12 @@ get_symbol_class (symtab_node *node)
   else if (!cgraph (node)->definition)
     return SYMBOL_EXTERNAL;
 
-  /* Comdats are duplicated to every use unless they are keyed.
-     Those do not need duplication.  */
-  if (DECL_COMDAT (node->decl)
+  /* Linker discardable symbols are duplicated to every use unless they are
+     keyed.
+     Keyed symbols or those.  */
+  if (DECL_ONE_ONLY (node->decl)
       && !node->force_output
+      && !node->forced_by_abi
       && !symtab_used_from_object_file_p (node))
     return SYMBOL_DUPLICATE;
 
index d46f0084458b60a6d8a69835334440d02dd58bcf..295c27d9d8dc59d940125b63ac9edcf0f21ca65f 100644 (file)
@@ -6739,7 +6739,7 @@ default_binds_local_p_1 (const_tree exp, int shlib)
       && (TREE_STATIC (exp) || DECL_EXTERNAL (exp)))
     {
       varpool_node *vnode = varpool_get_node (exp);
-      if (vnode && resolution_local_p (vnode->resolution))
+      if (vnode && (resolution_local_p (vnode->resolution) || vnode->in_other_partition))
        resolved_locally = true;
       if (vnode
          && resolution_to_local_definition_p (vnode->resolution))
@@ -6749,7 +6749,7 @@ default_binds_local_p_1 (const_tree exp, int shlib)
     {
       struct cgraph_node *node = cgraph_get_node (exp);
       if (node
-         && resolution_local_p (node->resolution))
+         && (resolution_local_p (node->resolution) || node->in_other_partition))
        resolved_locally = true;
       if (node
          && resolution_to_local_definition_p (node->resolution))