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.
+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.
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;
+ }
}
}
}
[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] } {
{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] } {
--- /dev/null
+extern int counter;
+
+extern void g(void);
+
+void f(void)
+{
+ g();
+ counter++;
+}
--- /dev/null
+#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;
+}