diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2016-05-25 08:40:52 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2016-05-25 08:41:05 -0700 |
commit | b95a0a3177bcf797c8f5ad6a7d276fb6275352b7 (patch) | |
tree | e117a53aa091141f8779f85e94d718ab44da2e04 /ld/testsuite/ld-plugin | |
parent | 7bd787e8774f96712d2e15a4094f094e00ff45ba (diff) | |
download | gdb-b95a0a3177bcf797c8f5ad6a7d276fb6275352b7.zip gdb-b95a0a3177bcf797c8f5ad6a7d276fb6275352b7.tar.gz gdb-b95a0a3177bcf797c8f5ad6a7d276fb6275352b7.tar.bz2 |
Skip an archive element if not added by linker
During archive rescan to resolve symbol references for files added by
LTO, linker add_archive_element callback is called to check if an
archive element should added. After all IR symbols have been claimed,
linker won't claim new IR symbols and shouldn't add the LTO archive
element. This patch updates linker add_archive_element callback to
return FALSE when seeing an LTO archive element during rescan and
changes ELF linker to skip such archive element.
bfd/
PR ld/20103
* cofflink.c (coff_link_check_archive_element): Return TRUE if
linker add_archive_element callback returns FALSE.
* ecoff.c (ecoff_link_check_archive_element): Likewise.
* elf64-ia64-vms.c (elf64_vms_link_add_archive_symbols): Skip
archive element if linker add_archive_element callback returns
FALSE.
* elflink.c (elf_link_add_archive_symbols): Likewise.
* pdp11.c (aout_link_check_ar_symbols): Likewise.
* vms-alpha.c (alpha_vms_link_add_archive_symbols): Likewise.
* xcofflink.c (xcoff_link_check_dynamic_ar_symbols): Likewise.
(xcoff_link_check_ar_symbols): Likewise.
ld/
PR ld/20103
* ldmain.c (add_archive_element): Don't claim new IR symbols
after all IR symbols have been claimed.
* plugin.c (plugin_call_claim_file): Remove no_more_claiming
check.
* testsuite/ld-plugin/lto.exp (pr20103): New proc.
Run PR ld/20103 tests.
* testsuite/ld-plugin/pr20103a.c: New file.
* testsuite/ld-plugin/pr20103b.c: Likewise.
* testsuite/ld-plugin/pr20103c.c: Likewise.
Diffstat (limited to 'ld/testsuite/ld-plugin')
-rw-r--r-- | ld/testsuite/ld-plugin/lto.exp | 85 | ||||
-rw-r--r-- | ld/testsuite/ld-plugin/pr20103a.c | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-plugin/pr20103b.c | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-plugin/pr20103c.c | 6 |
4 files changed, 102 insertions, 0 deletions
diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp index 6330a17..7a13abb 100644 --- a/ld/testsuite/ld-plugin/lto.exp +++ b/ld/testsuite/ld-plugin/lto.exp @@ -460,4 +460,89 @@ if { [is_elf_format] } { run_ld_link_exec_tests [] $lto_run_elf_tests } +proc pr20103 {cflags libs} { + global CC + + set testname "PR ld/20103 ($cflags $libs)" + set exec_output [run_host_cmd "$CC" "$cflags $libs"] + if { [ regexp "undefined reference to `dead'" $exec_output ] } { + pass "$testname (1)" + } { + fail "$testname (1)" + } + if { [ regexp "plugin needed to handle lto object" $exec_output ] } { + fail "$testname (2)" + } { + pass "$testname (2)" + } +} + +if { [check_lto_fat_available] } { + run_cc_link_tests [list \ + [list \ + "Build fatpr20103a.a" \ + "$plug_opt" "-flto -ffat-lto-objects" \ + {pr20103a.c} {} "fatpr20103a.a" + ] \ + [list \ + "Build fatpr20103b.a" \ + "$plug_opt" "-flto -ffat-lto-objects" \ + {pr20103b.c} {} "fatpr20103b.a" + ] \ + [list \ + "Build fatpr20103c.a" \ + "$plug_opt" "-flto -ffat-lto-objects" \ + {pr20103c.c} {} "fatpr20103c.a" \ + ] \ + [list \ + "Build thinpr20103a.a" \ + "$plug_opt" "-flto -fno-fat-lto-objects" \ + {pr20103a.c} {} "thinpr20103a.a" + ] \ + [list \ + "Build thinpr20103b.a" \ + "$plug_opt" "-flto -fno-fat-lto-objects" \ + {pr20103b.c} {} "thinpr20103b.a" + ] \ + [list \ + "Build thinpr20103c.a" \ + "$plug_opt" "-flto -fno-fat-lto-objects" \ + {pr20103c.c} {} "thinpr20103c.a" \ + ] \ + [list \ + "Build pr20103a" \ + "-O2 -flto -Wl,--start-group tmpdir/thinpr20103a.a tmpdir/thinpr20103b.a tmpdir/thinpr20103c.a -Wl,--end-group" \ + "-O2 -flto" \ + {dummy.c} {} "pr20103a" \ + ] \ + [list \ + "Build pr20103b" \ + "-O2 -flto -Wl,--start-group tmpdir/fatpr20103a.a tmpdir/fatpr20103b.a tmpdir/fatpr20103c.a -Wl,--end-group" \ + "-O2 -flto" \ + {dummy.c} {} "pr20103b" \ + ] \ + [list \ + "Build pr20103c" \ + "-O2 -Wl,--start-group tmpdir/fatpr20103a.a tmpdir/fatpr20103b.a tmpdir/fatpr20103c.a -Wl,--end-group" \ + "-O2" \ + {dummy.c} {} "pr20103c" \ + ] \ + ] + pr20103 "-O2 -flto" "tmpdir/thinpr20103a.a tmpdir/thinpr20103b.a tmpdir/thinpr20103c.a" + pr20103 "-O2 -flto" "tmpdir/fatpr20103a.a tmpdir/fatpr20103b.a tmpdir/fatpr20103c.a" + pr20103 "-O2" "tmpdir/fatpr20103a.a tmpdir/fatpr20103b.a tmpdir/fatpr20103c.a" + + if { [at_least_gcc_version 4 9] } { + run_cc_link_tests [list \ + [list \ + "Build pr20103d" \ + "-O2 -Wl,--start-group tmpdir/thinpr20103a.a tmpdir/thinpr20103b.a tmpdir/thinpr20103c.a -Wl,--end-group" \ + "-O2" \ + {dummy.c} {} "pr20103d" \ + ] \ + ] + pr20103 "-O2" "tmpdir/thinpr20103a.a tmpdir/thinpr20103b.a tmpdir/thinpr20103c.a" + } +} + restore_notify diff --git a/ld/testsuite/ld-plugin/pr20103a.c b/ld/testsuite/ld-plugin/pr20103a.c new file mode 100644 index 0000000..6ebfd2c --- /dev/null +++ b/ld/testsuite/ld-plugin/pr20103a.c @@ -0,0 +1,8 @@ +void live(); + +int +main () +{ + live(); + return 0; +} diff --git a/ld/testsuite/ld-plugin/pr20103b.c b/ld/testsuite/ld-plugin/pr20103b.c new file mode 100644 index 0000000..ead122d --- /dev/null +++ b/ld/testsuite/ld-plugin/pr20103b.c @@ -0,0 +1,3 @@ +void dead() +{ +} diff --git a/ld/testsuite/ld-plugin/pr20103c.c b/ld/testsuite/ld-plugin/pr20103c.c new file mode 100644 index 0000000..fb94e02 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr20103c.c @@ -0,0 +1,6 @@ +extern void dead (); + +void live() +{ + dead (); +} |