Don't issue a warning for references in LTO IR to warning symbols

bfd/
	PR ld/16746
	* linker.c (_bfd_generic_link_add_one_symbol): Don't issue a
	warning for references in LTO IR to warning symbols.

ld/testsuite/
	PR ld/16746
	* ld-plugin/lto.exp: Add 4 tests for PR ld/16746.
	* ld-plugin/pr16746a.c: New file.
	* ld-plugin/pr16746b.c: Likewise.
	* ld-plugin/pr16746c.c: Likewise.
	* ld-plugin/pr16746d.c: Likewise.
This commit is contained in:
H.J. Lu 2014-08-07 09:53:46 +09:30 committed by Alan Modra
parent 59c2656733
commit db7129469b
8 changed files with 73 additions and 8 deletions

View File

@ -1,3 +1,10 @@
2014-08-07 H.J. Lu <hongjiu.lu@intel.com>
Alan Modra <amodra@gmail.com>
PR ld/16746
* linker.c (_bfd_generic_link_add_one_symbol): Don't issue a
warning for references in LTO IR to warning symbols.
2014-08-07 Alan Modra <amodra@gmail.com>
* linker.c (WARN, CWARN): Collapse these states to WARN.

View File

@ -1776,8 +1776,10 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
break;
case WARNC:
/* Issue a warning and cycle. */
if (h->u.i.warning != NULL)
/* Issue a warning and cycle, except when the reference is
in LTO IR. */
if (h->u.i.warning != NULL
&& (abfd->flags & BFD_PLUGIN) == 0)
{
if (! (*info->callbacks->warning) (info, h->u.i.warning,
h->root.string, abfd,
@ -1802,12 +1804,9 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
break;
case WARN:
/* Warn if this symbol has been referenced already,
otherwise add a warning. A symbol has been referenced if
the u.undef.next field is not NULL, or it is the tail of the
undefined symbol list. The REF case above helps to
ensure this. */
if (h->u.undef.next != NULL || info->hash->undefs_tail == h)
/* Warn if this symbol has been referenced already from non-IR,
otherwise add a warning. */
if (h->non_ir_ref)
{
if (! (*info->callbacks->warning) (info, string, h->root.string,
hash_entry_bfd (h), NULL, 0))

View File

@ -1,3 +1,12 @@
2014-08-07 H.J. Lu <hongjiu.lu@intel.com>
PR ld/16746
* ld-plugin/lto.exp: Add 4 tests for PR ld/16746.
* ld-plugin/pr16746a.c: New file.
* ld-plugin/pr16746b.c: Likewise.
* ld-plugin/pr16746c.c: Likewise.
* ld-plugin/pr16746d.c: Likewise.
2014-08-06 Alan Modra <amodra@gmail.com>
* lib/ld-lib.exp (check_lto_fat_available): New.

View File

@ -232,6 +232,18 @@ set lto_link_elf_tests [list \
[list "Build libpr15146d.a" \
"$plug_opt" "-flto -O2" \
{pr15146d.c} {} "lib15146d.a"] \
[list "Build libpr16746a.a" \
"" "" \
{pr16746a.c pr16746b.c} {} "lib15146a.a"] \
[list "Build libpr16746b.a" \
"$plug_opt" "-O2 -flto" \
{pr16746c.c pr16746d.c} {} "lib15146b.a"] \
[list "PR ld/16746 (1)" \
"-O2 -flto -fuse-linker-plugin tmpdir/pr16746a.o tmpdir/pr16746c.o" "-O2 -flto" \
{dummy.c} {} "pr16746a.exe"] \
[list "PR ld/16746 (2)" \
"-O2 -flto -fuse-linker-plugin tmpdir/pr16746c.o tmpdir/pr16746a.o" "-O2 -flto" \
{dummy.c} {} "pr16746b.exe"] \
]
# Check final symbols in executables.
@ -335,6 +347,20 @@ if { [is_elf_format] && [check_lto_shared_available] } {
} {
fail $testname
}
set testname "PR ld/16746 (3)"
set exec_output [run_host_cmd "$CC" "-O2 -flto -fuse-linker-plugin tmpdir/pr16746b.o tmpdir/pr16746d.o"]
if { [ regexp "warning: foobar" $exec_output ] && ![ regexp "symbol from plugin" $exec_output ] } {
pass $testname
} {
fail $testname
}
set testname "PR ld/16746 (4)"
set exec_output [run_host_cmd "$CC" "-O2 -flto -fuse-linker-plugin tmpdir/pr16746d.o tmpdir/pr16746b.o"]
if { [ regexp "warning: foobar" $exec_output ] && ![ regexp "symbol from plugin" $exec_output ] } {
pass $testname
} {
fail $testname
}
}
set testname "Build liblto-11.a"

View File

@ -0,0 +1,3 @@
static const char __evoke_link_warning_foobar[]
__attribute__ ((used, section (".gnu.warning.foobar\n\t#")))
= "foobar";

View File

@ -0,0 +1,5 @@
static const char __evoke_link_warning_foobar[]
__attribute__ ((used, section (".gnu.warning.foobar\n\t#")))
= "foobar";
void foobar (void) {}

View File

@ -0,0 +1,8 @@
extern void foobar (void);
int
main (int argc, char **argv)
{
if (__builtin_constant_p (argc))
foobar ();
return 0;
}

View File

@ -0,0 +1,8 @@
extern void foobar (void);
int
main (int argc, char **argv)
{
if (!__builtin_constant_p (argc))
foobar ();
return 0;
}