+2016-05-25 H.J. Lu <hongjiu.lu@intel.com>
+
+ 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.
+
2016-05-24 Maciej W. Rozycki <macro@imgtec.com>
* elfxx-mips.c (_bfd_mips_elf_relocate_section)
if (h->type != bfd_link_hash_undefined)
return TRUE;
+ /* Include this element? */
if (!(*info->callbacks->add_archive_element) (info, abfd, name, &abfd))
- return FALSE;
+ return TRUE;
*pneeded = TRUE;
return coff_link_add_object_symbols (abfd, info);
if (h->type != bfd_link_hash_undefined)
return TRUE;
- /* Include this element. */
+ /* Include this element? */
if (!(*info->callbacks->add_archive_element) (info, abfd, name, &abfd))
- return FALSE;
+ return TRUE;
*pneeded = TRUE;
return ecoff_link_add_object_symbols (abfd, info);
to include it. We don't need to check anything. */
if (! (*info->callbacks->add_archive_element) (info, element,
h->root.string, &element))
- return FALSE;
+ continue;
if (! elf64_vms_link_add_object_symbols (element, info))
return FALSE;
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;
However, it might be correct. */
if (!(*info->callbacks
->add_archive_element) (info, abfd, name, subsbfd))
- return FALSE;
+ continue;
*pneeded = TRUE;
return TRUE;
}
to include it. We don't need to check anything. */
if (!(*info->callbacks
->add_archive_element) (info, element, h->root.string, &element))
- return FALSE;
+ continue;
if (!alpha_vms_link_add_object_symbols (element, info))
return FALSE;
{
if (!(*info->callbacks
->add_archive_element) (info, abfd, name, subsbfd))
- return FALSE;
+ continue;
*pneeded = TRUE;
return TRUE;
}
{
if (!(*info->callbacks
->add_archive_element) (info, abfd, name, subsbfd))
- return FALSE;
+ continue;
*pneeded = TRUE;
return TRUE;
}
+2016-05-25 H.J. Lu <hongjiu.lu@intel.com>
+
+ 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.
+
2016-05-24 Maciej W. Rozycki <macro@imgtec.com>
* testsuite/ld-mips-elf/jalx-local.d: New test.
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;
}
{
plugin_t *curplug = plugins_list;
*claimed = FALSE;
- if (no_more_claiming)
- return 0;
while (curplug && !*claimed)
{
if (curplug->claim_file_handler)
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
--- /dev/null
+void live();
+
+int
+main ()
+{
+ live();
+ return 0;
+}
--- /dev/null
+void dead()
+{
+}
--- /dev/null
+extern void dead ();
+
+void live()
+{
+ dead ();
+}