]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
ld: Set non_ir_ref_regular on source for assignment
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 24 Jun 2020 10:56:05 +0000 (03:56 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 24 Jun 2020 10:56:16 +0000 (03:56 -0700)
We need to set non_ir_ref_regular on the source for assignment to get
the correct LTO resolution:

190 a27be7f4ad90c5ce PREVAILING_DEF real_g

instead of

190 30c3b2d8f967f5ea PREVAILING_DEF_IRONLY real_g

PR ld/26163
* ldexp.c (exp_fold_tree_1): Set non_ir_ref_regular on the source
for assignment.
* testsuite/ld-plugin/lto.exp: Run ld/26163 test.
* testsuite/ld-plugin/pr26163a.c: New file.
* testsuite/ld-plugin/pr26163b.c: Likewise.

ld/ChangeLog
ld/ldexp.c
ld/testsuite/ld-plugin/lto.exp
ld/testsuite/ld-plugin/pr26163a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/pr26163b.c [new file with mode: 0644]

index 9f465b224d501296a9e909e311ae4d0c7c66cb3a..fd0b98950e1c7193a215ebbfe0f30bd42e8092f6 100644 (file)
@@ -1,3 +1,12 @@
+2020-06-24  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/26163
+       * ldexp.c (exp_fold_tree_1): Set non_ir_ref_regular on the source
+       for assignment.
+       * testsuite/ld-plugin/lto.exp: Run ld/26163 test.
+       * testsuite/ld-plugin/pr26163a.c: New file.
+       * testsuite/ld-plugin/pr26163b.c: Likewise.
+
 2020-06-24  Alan Modra  <amodra@gmail.com>
 
        * lexsup.c (elf_shlib_list_options): Properly format help message.
index 3ffabb8c1da6e2f2677b1dc63e25e7ee92221c03..b4e7c41209dd48c82bc2476f1ffc83c3f3235586 100644 (file)
@@ -1217,15 +1217,19 @@ exp_fold_tree_1 (etree_type *tree)
                        bfd_link_hide_symbol (link_info.output_bfd,
                                              &link_info, h);
 
-                     /* Copy the symbol type if this is an expression only
+                     /* Copy the symbol type and set non_ir_ref_regular
+                        on the source if this is an expression only
                         referencing a single symbol.  (If the expression
                         contains ternary conditions, ignoring symbols on
                         false branches.)  */
                      if (expld.assign_src != NULL
                          && (expld.assign_src
                              != (struct bfd_link_hash_entry *) -1))
-                       bfd_copy_link_hash_symbol_type (link_info.output_bfd,
-                                                       h, expld.assign_src);
+                       {
+                         bfd_copy_link_hash_symbol_type (link_info.output_bfd,
+                                                         h, expld.assign_src);
+                         expld.assign_src->non_ir_ref_regular = TRUE;
+                       }
                    }
                }
            }
index a7b9cacfd850c64100cd4e0a2996b6c5b08bb486..5a6ba7ad83733a1aceb753d0f1aafa337ae66d35 100644 (file)
@@ -207,6 +207,9 @@ set lto_link_tests [list \
   [list "Build pr24406-2b.o" \
    "" "-O2 -fno-lto" \
    {pr24406-2b.c}] \
+  [list "Build pr26163a.o" \
+   "" "-O2 -fno-lto" \
+   {pr26163a.c}] \
 ]
 
 if { [at_least_gcc_version 10 0] } {
@@ -502,6 +505,11 @@ set lto_run_tests [list \
    {pr24406-2a.c} "pr24406-2" "pass.out" \
    "-flto -O2" "c" "" \
    "tmpdir/pr24406-2b.o -Wl,--wrap=cook"] \
+  [list "Run pr26163" \
+   "-O2 -flto" "" \
+   {pr26163b.c} "pr24406-2" "pass.out" \
+   "-flto -O2" "c" "" \
+   "tmpdir/pr26163a.o -Wl,--defsym,g=real_g"] \
 ]
 
 if { [at_least_gcc_version 4 7] } {
diff --git a/ld/testsuite/ld-plugin/pr26163a.c b/ld/testsuite/ld-plugin/pr26163a.c
new file mode 100644 (file)
index 0000000..4c9979b
--- /dev/null
@@ -0,0 +1,9 @@
+extern int counter;
+
+extern void g(void);
+
+void f(void)
+{
+  g();
+  counter++;
+}
diff --git a/ld/testsuite/ld-plugin/pr26163b.c b/ld/testsuite/ld-plugin/pr26163b.c
new file mode 100644 (file)
index 0000000..5524b4e
--- /dev/null
@@ -0,0 +1,19 @@
+#include <stdio.h>
+
+int counter;
+extern void f(void);
+
+void
+real_g(void)
+{
+  counter++;
+}
+
+int main()
+{
+  real_g();
+  f();
+  if (counter == 3)
+    printf ("PASS\n");
+  return 0;
+}