From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 45473 invoked by alias); 18 May 2016 02:24:17 -0000 Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org Received: (qmail 45444 invoked by uid 89); 18 May 2016 02:24:12 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.3 required=5.0 tests=AWL,BAYES_00,KAM_LAZY_DOMAIN_SECURITY,NO_DNS_FOR_FROM,RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=CC, offer, claim, H*R:D*gmail.com X-HELO: mga11.intel.com Received: from mga11.intel.com (HELO mga11.intel.com) (192.55.52.93) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 18 May 2016 02:24:10 +0000 Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga102.fm.intel.com with ESMTP; 17 May 2016 19:24:09 -0700 X-ExtLoop1: 1 Received: from gnu-6.sc.intel.com ([172.25.70.218]) by orsmga003.jf.intel.com with ESMTP; 17 May 2016 19:24:09 -0700 Received: by gnu-6.sc.intel.com (Postfix, from userid 1000) id A4076200B11; Tue, 17 May 2016 19:24:08 -0700 (PDT) Date: Wed, 18 May 2016 02:24:00 -0000 From: "H.J. Lu" To: binutils@sourceware.org Subject: [PATCH] PR ld/20103: Skip an archive element if not added by linker Message-ID: <20160518022408.GA28694@intel.com> Reply-To: "H.J. Lu" MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.6.0 (2016-04-01) X-SW-Source: 2016-05/txt/msg00224.txt.bz2 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. Other linker backends may also need similar update. Tested on x86. OK for master? H.J. ---- bfd/ PR ld/20103 * elflink.c (elf_link_add_archive_symbols): Skip archive element if linker add_archive_element callback returns FALSE. 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. --- bfd/elflink.c | 2 +- ld/ldmain.c | 12 +++++- ld/plugin.c | 2 - ld/testsuite/ld-plugin/lto.exp | 85 +++++++++++++++++++++++++++++++++++++++ ld/testsuite/ld-plugin/pr20103a.c | 8 ++++ ld/testsuite/ld-plugin/pr20103b.c | 3 ++ ld/testsuite/ld-plugin/pr20103c.c | 6 +++ 7 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 ld/testsuite/ld-plugin/pr20103a.c create mode 100644 ld/testsuite/ld-plugin/pr20103b.c create mode 100644 ld/testsuite/ld-plugin/pr20103c.c diff --git a/bfd/elflink.c b/bfd/elflink.c index 1569e93..b4efd5a 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -5283,7 +5283,7 @@ elf_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info) if (!(*info->callbacks ->add_archive_element) (info, element, symdef->name, &element)) - goto error_return; + continue; if (!bfd_link_add_symbols (element, info)) goto error_return; diff --git a/ld/ldmain.c b/ld/ldmain.c index 21133ab..7d04be2 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -796,12 +796,22 @@ add_archive_element (struct bfd_link_info *info, BFD, but we still want to output the original BFD filename. */ orig_input = *input; #ifdef ENABLE_PLUGINS - if (link_info.lto_plugin_active && !no_more_claiming) + if (link_info.lto_plugin_active) { /* We must offer this archive member to the plugins to claim. */ plugin_maybe_claim (input); if (input->flags.claimed) { + if (no_more_claiming) + { + /* Don't claim new IR symbols after all IR symbols have + been claimed. */ + if (trace_files || verbose) + info_msg ("%I: no new IR symbols to claimi\n", + &orig_input); + input->flags.claimed = 0; + return FALSE; + } input->flags.claim_archive = TRUE; *subsbfd = input->the_bfd; } diff --git a/ld/plugin.c b/ld/plugin.c index a60ffca..c951995 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -1033,8 +1033,6 @@ plugin_call_claim_file (const struct ld_plugin_input_file *file, int *claimed) { plugin_t *curplug = plugins_list; *claimed = FALSE; - if (no_more_claiming) - return 0; while (curplug && !*claimed) { if (curplug->claim_file_handler) 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 (); +} -- 2.5.5