https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85801

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2018-05-17
                 CC|                            |hubicka at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #11 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to H.J. Lu from comment #10)
> For LDPR_PREVAILING_DEF_IRONLY_EXP, if the IR definition is common,
> compiler can't assume that the IR definition will prevail during the
> final link.  This is another COMMON symbol issue like
> 
> https://sourceware.org/bugzilla/show_bug.cgi?id=23079

So the following might help (and shows bad abstraction of
resolution_to_local_definition_p which depends on symbol type).
Similar fixes would be needed for decl_binds_to_current_def_p
(somehow split out code computing defined_locally and resolved_locally
based on resolution from the former function).
In other places the cgraph code seems to honor the fact that a
common might be prevailed.

Honza?

diff --git a/gcc/varasm.c b/gcc/varasm.c
index 85296b4a2ec..1021237389e 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -7075,7 +7075,9 @@ default_binds_local_p_3 (const_tree exp, bool shlib, bool
weak_dominate,
        defined_locally = true;
       if (node->can_be_discarded_p ())
        ;
-      else if (resolution_to_local_definition_p (node->resolution))
+      else if (resolution_to_local_definition_p (node->resolution)
+              && (defined_locally
+                  || node->resolution != LDPR_PREVAILING_DEF_IRONLY_EXP))
        defined_locally = resolved_locally = true;
       else if (resolution_local_p (node->resolution))
        resolved_locally = true;

Reply via email to