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>
|
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.
|
||||||
|
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,
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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] } {
|
||||||
|
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