mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-24 10:35:12 +08:00
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:
parent
a5aae5087c
commit
5376d47f66
@ -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.
|
||||
|
10
ld/ldexp.c
10
ld/ldexp.c
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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] } {
|
||||
|
9
ld/testsuite/ld-plugin/pr26163a.c
Normal file
9
ld/testsuite/ld-plugin/pr26163a.c
Normal file
@ -0,0 +1,9 @@
|
||||
extern int counter;
|
||||
|
||||
extern void g(void);
|
||||
|
||||
void f(void)
|
||||
{
|
||||
g();
|
||||
counter++;
|
||||
}
|
19
ld/testsuite/ld-plugin/pr26163b.c
Normal file
19
ld/testsuite/ld-plugin/pr26163b.c
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user