Fix symver attribute with LTO
authorJan Hubicka <hubicka@ucw.cz>
Thu, 19 Dec 2019 10:03:48 +0000 (11:03 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 19 Dec 2019 10:03:48 +0000 (10:03 +0000)
* cgraph.c (cgraph_node_cannot_be_local_p_1): Prevent targets of
symver attributes to be localized.
* ipa-visibility.c (cgraph_externally_visible_p,
varpool_node::externally_visible_p): Likewise.
* symtab.c (symtab_node::verify_base): Check visibility of symbol
versions.

* lto-common.c (read_cgraph_and_symbols): Work around binutils
PR25424

Co-Authored-By: Xi Ruoyao <xry111@mengyan1223.wang>
From-SVN: r279566

gcc/ChangeLog
gcc/cgraph.c
gcc/ipa-visibility.c
gcc/lto/ChangeLog
gcc/lto/lto-common.c
gcc/symtab.c

index 3b703386dddac68f4bd31854ec4561296f87c950..5d938ae09d393748f2b57716d1f35787b281d6a2 100644 (file)
@@ -1,3 +1,13 @@
+2019-12-19  Jan Hubicka  <hubicka@ucw.cz>
+           Xi Ruoyao  <xry111@mengyan1223.wang>
+
+       * cgraph.c (cgraph_node_cannot_be_local_p_1): Prevent targets of
+       symver attributes to be localized.
+       * ipa-visibility.c (cgraph_externally_visible_p,
+       varpool_node::externally_visible_p): Likewise.
+       * symtab.c (symtab_node::verify_base): Check visibility of symbol
+       versions.
+
 2019-12-19  Jan Hubicka  <hubicka@ucw.cz>
            Luo Xiong Hu  <luoxhu@linux.ibm.com
 
index ba5f2767e4b0573a2ef73068ecdaaf44f383b4e0..5ba33a5a0cc2beded1c59aadc41dce8cef565a36 100644 (file)
@@ -2226,6 +2226,9 @@ cgraph_node_cannot_be_local_p_1 (cgraph_node *node, void *)
 {
   return !(!node->force_output
           && !node->ifunc_resolver
+          /* Limitation of gas requires us to output targets of symver aliases
+             as global symbols.  This is binutils PR 25295.  */
+          && !node->symver
           && ((DECL_COMDAT (node->decl)
                && !node->forced_by_abi
                && !node->used_from_object_file_p ()
index f470465f93591eb5c956ac41335a31fb1f763cd4..d216a54a7abc8bb25a06bb1ffee66d60e677f9aa 100644 (file)
@@ -220,6 +220,14 @@ cgraph_externally_visible_p (struct cgraph_node *node,
       && lookup_attribute ("dllexport",
                           DECL_ATTRIBUTES (node->decl)))
     return true;
+
+  /* Limitation of gas requires us to output targets of symver aliases as
+     global symbols.  This is binutils PR 25295.  */
+  ipa_ref *ref;
+  FOR_EACH_ALIAS (node, ref)
+    if (ref->referring->symver)
+      return true;
+
   if (node->resolution == LDPR_PREVAILING_DEF_IRONLY)
     return false;
   /* When doing LTO or whole program, we can bring COMDAT functoins static.
@@ -284,14 +292,13 @@ varpool_node::externally_visible_p (void)
                           DECL_ATTRIBUTES (decl)))
     return true;
 
-  /* See if we have linker information about symbol not being used or
-     if we need to make guess based on the declaration.
+  /* Limitation of gas requires us to output targets of symver aliases as
+     global symbols.  This is binutils PR 25295.  */
+  ipa_ref *ref;
+  FOR_EACH_ALIAS (this, ref)
+    if (ref->referring->symver)
+      return true;
 
-     Even if the linker clams the symbol is unused, never bring internal
-     symbols that are declared by user as used or externally visible.
-     This is needed for i.e. references from asm statements.   */
-  if (used_from_object_file_p ())
-    return true;
   if (resolution == LDPR_PREVAILING_DEF_IRONLY)
     return false;
 
index 9f974afb123dd13c08f1875608b19dc0bc161e67..d0b1dba740e93aadd6b31736a56f382e39cc6036 100644 (file)
@@ -1,3 +1,9 @@
+2019-12-19  Jan Hubicka  <hubicka@ucw.cz>
+           Xi Ruoyao  <xry111@mengyan1223.wang>
+
+       * lto-common.c (read_cgraph_and_symbols): Work around binutils
+       PR25424
+
 2019-12-07  Jan Hubicka  <hubicka@ucw.cz>
 
        * lto-partition.c (lto_balanced_map): Fix printing of tp_first_run.
index 76a9d9383d539dc3f3337fbd2d9a7fbea20d276f..ee07730a27d31dee8eedbc6d7e388d1ee96c3bbb 100644 (file)
@@ -2818,6 +2818,11 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames)
                           IDENTIFIER_POINTER
                             (DECL_ASSEMBLER_NAME (snode->decl)));
          }
+       /* Symbol versions are always used externally, but linker does not
+          report that correctly.
+          This is binutils PR25924.  */
+       else if (snode->symver && *res == LDPR_PREVAILING_DEF_IRONLY)
+         snode->resolution = LDPR_PREVAILING_DEF_IRONLY_EXP;
        else
          snode->resolution = *res;
       }
index 10b8ed1d178baa2cd0a93f12362fe85578b3e619..9c52192fced826f3ff02ff3e4d1f20ec30bdffbc 100644 (file)
@@ -1156,6 +1156,22 @@ symtab_node::verify_base (void)
       error ("node is symver but not alias");
       error_found = true;
     }
+  /* Limitation of gas requires us to output targets of symver aliases as
+     global symbols.  This is binutils PR 25295.  */
+  if (symver
+      && (!TREE_PUBLIC (get_alias_target ()->decl)
+         || DECL_VISIBILITY (get_alias_target ()->decl) != VISIBILITY_DEFAULT))
+    {
+      error ("symver target is not exported with default visibility");
+      error_found = true;
+    }
+  if (symver
+      && (!TREE_PUBLIC (decl)
+         || DECL_VISIBILITY (decl) != VISIBILITY_DEFAULT))
+    {
+      error ("symver is not exported with default visibility");
+      error_found = true;
+    }
   if (same_comdat_group)
     {
       symtab_node *n = same_comdat_group;