ld: Set non_ir_ref_regular on source for assignment

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.
This commit is contained in:
H.J. Lu 2020-06-24 03:56:05 -07:00
parent a5aae5087c
commit 5376d47f66
5 changed files with 52 additions and 3 deletions

View 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> 2020-06-24 Alan Modra <amodra@gmail.com>
* lexsup.c (elf_shlib_list_options): Properly format help message. * lexsup.c (elf_shlib_list_options): Properly format help message.

View File

@ -1217,15 +1217,19 @@ exp_fold_tree_1 (etree_type *tree)
bfd_link_hide_symbol (link_info.output_bfd, bfd_link_hide_symbol (link_info.output_bfd,
&link_info, h); &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 referencing a single symbol. (If the expression
contains ternary conditions, ignoring symbols on contains ternary conditions, ignoring symbols on
false branches.) */ false branches.) */
if (expld.assign_src != NULL if (expld.assign_src != NULL
&& (expld.assign_src && (expld.assign_src
!= (struct bfd_link_hash_entry *) -1)) != (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;
}
} }
} }
} }

View File

@ -207,6 +207,9 @@ set lto_link_tests [list \
[list "Build pr24406-2b.o" \ [list "Build pr24406-2b.o" \
"" "-O2 -fno-lto" \ "" "-O2 -fno-lto" \
{pr24406-2b.c}] \ {pr24406-2b.c}] \
[list "Build pr26163a.o" \
"" "-O2 -fno-lto" \
{pr26163a.c}] \
] ]
if { [at_least_gcc_version 10 0] } { if { [at_least_gcc_version 10 0] } {
@ -502,6 +505,11 @@ set lto_run_tests [list \
{pr24406-2a.c} "pr24406-2" "pass.out" \ {pr24406-2a.c} "pr24406-2" "pass.out" \
"-flto -O2" "c" "" \ "-flto -O2" "c" "" \
"tmpdir/pr24406-2b.o -Wl,--wrap=cook"] \ "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] } { if { [at_least_gcc_version 4 7] } {

View File

@ -0,0 +1,9 @@
extern int counter;
extern void g(void);
void f(void)
{
g();
counter++;
}

View File

@ -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;
}