binutils-gdb/ld/testsuite/ld-plugin/lto.exp
H.J. Lu 59fa66c538 Handle symbol defined in IR and referenced in DSO
We need to make an IR symbol visible if it is defined in an IR object
and referenced in a dynamic object.  When --as-needed is used, since
linker removes the IR symbol reference of the dynamic object if the
dynamic object isn't needed in the first pass, the IR definition isn't
visible to the dynamic object even if the dynamic object becomes needed
in the second pass.  Add dynamic_ref_after_ir_def to bfd_link_hash_entry
to track IR symbol which is defined in an IR object and later referenced
in a dynamic object.  dynamic_ref_after_ir_def is preserved when restoring
the symbol table for unneeded dynamic object.

bfd/

	PR ld/21382
	* elflink.c (elf_link_add_object_symbols): Preserve
	dynamic_ref_after_ir_def when restoring the symbol table for
	unneeded dynamic object.

include/

	PR ld/21382
	* bfdlink.h (bfd_link_hash_entry): Add dynamic_ref_after_ir_def.

ld/

	PR ld/21382
	* plugin.c (is_visible_from_outside): Symbol may be visible
	from outside if dynamic_ref_after_ir_def is set.
	(plugin_notice): Set dynamic_ref_after_ir_def if the symbol is
	defined in an IR object and referenced in a dynamic object.
	* testsuite/ld-plugin/lto.exp: Run PR ld/21382 tests.
	* testsuite/ld-plugin/pr21382a.c: New file.
	* testsuite/ld-plugin/pr21382b.c: Likewise.
2017-04-20 07:48:35 -07:00

602 lines
21 KiB
Plaintext

# Expect script for ld-plugin LTO tests
# Copyright (C) 2011-2017 Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
# Check to see if the C and C++ compilers work
if { [which $CC] == 0 || [which $CXX] == 0 } {
return
}
# These tests require plugin and LTO.
if { ![check_plugin_api_available]
|| ![check_lto_available] } {
return
}
global CFLAGS
global CXXFLAGS
set saved_CFLAGS "$CFLAGS"
set saved_CXXFLAGS "$CXXFLAGS"
regsub -all "(\\-Wp,)?-D_FORTIFY_SOURCE=\[0-9\]+" $CFLAGS "" CFLAGS
regsub -all "(\\-Wp,)?-D_FORTIFY_SOURCE=\[0-9\]+" $CXXFLAGS "" CXXFLAGS
proc restore_notify { } {
global saved_CFLAGS
global saved_CXXFLAGS
set CFLAGS "$saved_CFLAGS"
set CXXFLAGS "$saved_CXXFLAGS"
}
set plugin_names {
liblto_plugin.so
liblto_plugin-0.dll
cyglto_plugin-0.dll
}
set plug_opt ""
foreach plug $plugin_names {
set plug_so [run_host_cmd $CC "--print-prog-name $plug"]
if { $plug_so eq $plug } then {
set plug_so [run_host_cmd $CC "--print-file-name $plug"]
}
if { $plug_so ne $plug } then {
set plug_opt "--plugin $plug_so"
break
}
}
set lto_fat ""
set lto_no_fat ""
if { [check_lto_fat_available] } {
set lto_fat "-ffat-lto-objects"
set lto_no_fat "-fno-fat-lto-objects"
}
# Simple LTO tests and generate input files for complex LTO tests.
set lto_link_tests [list \
[list "LTO 1" \
"-O2 -flto -fuse-linker-plugin" "-flto -fuse-linker-plugin" \
{lto-1a.c lto-1b.c} {} "lto-1.exe"] \
[list "Compile 2" \
"" "-O2 -flto -fuse-linker-plugin" \
{lto-2.c} {} ""] \
[list "LTO 2" \
"-static -O2 -flto -fuse-linker-plugin tmpdir/lto-2.o -lm" "" \
{dummy.c} {} "lto-2.exe"] \
[list "Compile 3a" \
"" "-flto" \
{lto-3a.c} {} ""] \
[list "Compile 3c" \
"" "-O2" \
{lto-3c.c} {} ""] \
[list "Build liblto-3.a" \
"" "-flto $lto_fat" \
{lto-3b.c} {} "liblto-3.a"] \
[list "Compile 5a" \
"" "-flto $lto_fat" \
{lto-5a.c} {} ""] \
[list "Compile 5b" \
"" "-flto $lto_fat" \
{lto-5b.c} {} ""] \
[list "LTO 6" \
"-O2 -flto -fuse-linker-plugin" "" \
{lto-6.c} {} "lto-6.exe" "c"] \
[list "Compile PR ld/12365" \
"" "-flto -O2 $lto_fat" \
{pr12365a.c pr12365b.c pr12365c.c} {} ""] \
[list "Compile 9" \
"" "-O2 -finline -flto" \
{lto-9.cc} {} "" "c++"] \
[list "Compile 11a" \
"" "-O -flto" \
{lto-11a.c} {} ""] \
[list "Compile 11b" \
"" "-O -flto" \
{lto-11b.c} {} ""] \
[list "Compile 11c" \
"" "-O" \
{lto-11c.c} {} ""] \
[list "Build liblto-12.a" \
"$plug_opt" "-O2 -flto" \
{lto-12c.c} {} "liblto-12.a"] \
[list "Compile 12" \
"" "-O2 -flto" \
{lto-12a.c lto-12b.c} {} ""] \
[list "Compile 13" \
"" "-O2 -flto" \
{lto-13a.c lto-13b.c} {} ""] \
[list "Build liblto-13.a" \
"" "-O2" \
{lto-13c.c} {} "liblto-13.a"] \
[list "Compile 14a" \
"" "-flto" \
{lto-14a.c lto-14b.c} {} ""] \
[list "Build liblto-14.a" \
"$plug_opt" "-flto" \
{lto-14c.c} {} "liblto-14.a"] \
[list "Compile 15a" \
"" "-flto" \
{lto-15a.c} {} ""] \
[list "Build liblto-15.a" \
"$plug_opt" "-flto" \
{lto-15b.c} {} "liblto-15.a"] \
[list "PR ld/12696" \
"-O2 -flto -fuse-linker-plugin -r -nostdlib" "-O2 -flto" \
{pr12696-1.cc} {} "pr12696-1r.o" "c++"] \
[list "Compile PR ld/12758" \
"" "" \
{pr12758a.s} {} ""] \
[list "Build libpr12758.a" \
"" "-flto -O2 $lto_fat" \
{pr12758b.c} {} "libpr12758.a"] \
[list "PR ld/12758" \
"-O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin tmpdir/pr12758a.o -Wl,--start-group tmpdir/libpr12758.a -Wl,--end-group" "" \
{dummy.c} {} "pr12758.exe"] \
[list "Compile PR ld/12760" \
"" "-g -O0" \
{pr12760a.c} {} ""] \
[list "Build libpr12760.a" \
"" "-flto -O2 $lto_fat" \
{pr12760b.c} {} "libpr12760.a"] \
[list "PR ld/12760" \
"-O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin tmpdir/pr12760a.o -Wl,--start-group tmpdir/libpr12760.a -Wl,--end-group" "" \
{dummy.c} {{warning "pr12760a.c:6: warning: Bad \\.?bar"}} \
"pr12760.exe" "c"] \
[list "Build libpr13183.a" \
"-T" "-flto -O2 $lto_fat" \
{pr13183a.c} {} "libpr13183.a"] \
[list "Compile PR ld/13183" \
"" "-flto -O2" \
{pr13183b.c} {} ""] \
[list "Compile PR ld/13201" \
"" "-flto -O2" \
{pr13201.c} {} ""] \
[list "PR ld/13287" \
"-flto -fuse-linker-plugin -Wl,--as-needed" "-flto" \
{pr13287.cc} {} "pr13287.exe" "c++"] \
[list "PR ld/15323 (1)" \
"" "-O2" \
{pr15323a.c} {} "" "c"] \
[list "PR ld/15323 (2)" \
"-O2 -flto -r -nostdlib" "-O2 -flto" \
{pr15323a.c} {} "pr15323a-r.o" "c"] \
[list "Compile(1) PR ld/pr16846" \
"" "-flto" \
{pr16846a.c pr16846b.c} {} ""] \
[list "Compile(2) PR ld/pr16846" \
"" "" \
{pr16846c.c} {} ""] \
[list "PR ld/pr16846(1)" \
"-flto -fuse-linker-plugin tmpdir/pr16846a.o tmpdir/pr16846b.o tmpdir/pr16846c.o" "" \
{dummy.c} {} "pr16846a.exe"] \
[list "PR ld/pr16846(2)" \
"-flto -fuse-linker-plugin tmpdir/pr16846a.o tmpdir/pr16846c.o tmpdir/pr16846b.o" "" \
{dummy.c} {} "pr16846b.exe"] \
[list "PR ld/19317 (1)" \
"$plug_opt" "-flto $lto_no_fat" \
{pr19317.c} {} "libpr19317.a"] \
[list "Build pr20276a.o" \
"" "-fno-lto" \
{pr20276a.c}] \
[list "Build pr20276b.o" \
"$plug_opt" "-flto $lto_no_fat" \
{pr20276b.c}] \
[list "Build pr20267a.o" \
"" "" \
{pr20267a.c}] \
[list "Build libpr20267a.a" \
"$plug_opt" "-flto $lto_fat" \
{pr20267b.c} {} "libpr20267a.a"] \
[list "Build libpr20267b.a" \
"$plug_opt" "-flto $lto_no_fat" \
{pr20267b.c} {} "libpr20267b.a"] \
[list "Build pr20321" \
"-flto -Wl,-plugin,$plug_so" "-flto" \
{pr20321.c} {{warning ".*: duplicated plugin"}} \
"pr20321" "c"] \
]
if { [at_least_gcc_version 4 7] } {
set lto_link_tests [concat $lto_link_tests [list \
[list "Compile PR ld/12942 (1)" \
"" "-flto -O2" \
{pr12942a.cc pr12942c.cc} {} "" "c++"] \
[list "Compile PR ld/12942 (2)" \
"" "-O0" \
{pr12942b.cc} {} "" "c++"] \
]]
}
set lto_compile_elf_tests [list \
[list "Compile 7" \
"" "-flto -O2" \
{lto-7a.c lto-7b.c lto-7c.c} {} ""] \
[list "Compile 8a" \
"" "-O2" \
{lto-8a.c} {} ""] \
[list "Compile 8b" \
"" "-flto -O2" \
{lto-8b.c} {} ""] \
]
# Generate input files for complex LTO tests for ELF.
set lto_link_elf_tests [list \
[list "Build liblto-7.so" \
"-shared" "-O2 -fpic" \
{lto-7d.c} {} "liblto-7.so" "c"] \
[list "Build liblto-17a.so" \
"-shared -O2 -fpic -flto -fuse-linker-plugin" "-O2 -fpic -flto" \
{lto-17a.c} {{"nm" {} "lto-17a.d"}} "liblto-17a.so" "c"] \
[list "Build liblto-17b.so 1" \
"-shared -O2 -fpic -flto -fuse-linker-plugin tmpdir/lto-17a.o" "-O2 -fpic -flto" \
{lto-17b.c} {{"nm" {} "lto-17b-1.d"}} "liblto-17b.so"] \
[list "Build liblto-17b.so 2" \
"-shared -O2 -fpic -flto -fuse-linker-plugin tmpdir/lto-17a.o" "-O2 -fpic -flto" \
{lto-17b.c} {{"nm" {} "lto-17b-2.d"}} "liblto-17b.so"] \
[list "PR ld/12982" \
"-O2 -flto -fuse-linker-plugin" "-O2 -flto" \
{pr12982.c} {{"readelf" {-l --wide} "pr12982.d"}} "pr12982.exe"] \
[list "PR ld/12975" \
"-shared -O2 -fPIC -flto -fuse-linker-plugin -nostdlib -Wl,-version-script,pr12975.t" "-O2 -flto" \
{pr12975.c} {{"readelf" {-s --wide} "pr12975.d"}} "pr12975.so" "c"] \
[list "PR ld/13229" \
"-shared -O2 -fPIC -flto -fuse-linker-plugin -nostdlib" "-O2 -finline -fno-early-inlining -flto" \
{pr13229.cc} {{"readelf" {-s --wide} "pr13229.d"}} "pr13229.so" "c++"] \
[list "PR ld/13244" \
"-shared -O2 -fPIC -flto -fuse-linker-plugin -nostdlib" "-O2 -fno-early-inlining -flto" \
{pr13244.c} {{"readelf" {-s --wide} "pr13244.d"}} "pr13244.so" "c"] \
[list "Build libpr15146a.a" \
"$plug_opt" "-flto -O2" \
{pr15146a.c} {} "lib15146a.a"] \
[list "Build pr15146b.so" \
"-shared" "-O2 -fpic" \
{pr15146b.c} {} "pr15146b.so" "c"] \
[list "Build pr15146c.so" \
"-shared -Wl,--no-as-needed tmpdir/pr15146b.so" "-O2 -fpic" \
{pr15146c.c} {} "pr15146c.so" "c"] \
[list "PR ld/15146 (1)" \
"-O2 -flto -fuse-linker-plugin -Wl,-rpath-link,. -Wl,--no-copy-dt-needed-entries -Wl,--no-as-needed tmpdir/pr15146a.o tmpdir/pr15146c.so" "" \
{dummy.c} {{"readelf" {-d} "pr15146.d"}} "pr15146a.exe"] \
[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"] \
[list "PR ld/14918" \
"-flto" "-flto" \
{pr14918.c} {{"readelf" {-d --wide} "pr14918.d"}} "pr14918.exe" "c"] \
[list "Build pr21382a.o" \
"" "-O2 -flto" \
{pr21382a.c} {} "" "c"] \
[list "Build pr21382.so" \
"-shared" "-O2 -fpic" \
{pr21382b.c} {} "pr21382.so" "c"] \
]
# Check final symbols in executables.
set lto_link_symbol_tests [list \
[list "LTO 3 symbol" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-3a.o tmpdir/lto-3c.o tmpdir/liblto-3.a" "" \
{dummy.c} {{"nm" {} "lto-3.d"}} "lto-3.exe" "c"] \
[list "LTO 5 symbol" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-5.o" "" \
{dummy.c} {{"nm" {} "lto-5.d"}} "lto-5.exe" "c"] \
[list "LTO 9 symbol" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-9.o" "" \
{dummy.c} {{"nm" {-C} "lto-9.d"}} "lto-9.exe" "c++"] \
[list "LTO 16a symbol" \
"-O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin" "-flto" \
{lto-16a.c} {{"nm" {} "lto-16a.d"}} "lto-16.exe" "c"] \
[list "LTO 16b symbol" \
"-O2 -Wl,-e,foo -u bar -nostdlib -flto -fuse-linker-plugin" "-flto" \
{lto-16a.c lto-16b.c} {{"nm" {} "lto-16b.d"}} "lto-16b.exe" "c"] \
[list "PR ld/13183" \
"-O2 -flto -fuse-linker-plugin tmpdir/pr13183b.o tmpdir/libpr13183.a" "" \
{dummy.c} {{"nm" {} "pr13183.d"}} "pr13183.exe" "c"] \
]
# LTO run-time tests.
set lto_run_tests [list \
[list "LTO 3a" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-3a.o tmpdir/lto-3c.o tmpdir/liblto-3.a" "" \
{dummy.c} "lto-3b.exe" "lto-3.out" "" "c"] \
[list "LTO 3b" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-3a.o tmpdir/lto-3c.o tmpdir/lto-3.o" "" \
{dummy.c} "lto-3c.exe" "lto-3.out" "" "c"] \
[list "LTO 3c" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-3a.o tmpdir/lto-3c.o -Wl,--whole-archive tmpdir/liblto-3.a -Wl,--no-whole-archive tmpdir/liblto-3.a" "" \
{dummy.c} "lto-3d.exe" "lto-3.out" "" "c"] \
[list "LTO 5" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-5.o" "" \
{dummy.c} "lto-5.exe" "lto-5.out" "" "c"] \
[list "LTO 11" \
"-O -flto -fuse-linker-plugin tmpdir/liblto-11.a" "" \
{dummy.c} "lto-11.exe" "lto-11.out" "" "c"] \
[list "LTO 12a" \
"-O -flto -fuse-linker-plugin tmpdir/lto-12a.o tmpdir/liblto-12.a tmpdir/lto-12b.o" "" \
{dummy.c} "lto-12a.exe" "lto-12.out" "" "c"] \
[list "LTO 12b" \
"-O -flto -fuse-linker-plugin tmpdir/lto-12a.o tmpdir/lto-12b.o tmpdir/liblto-12.a" "" \
{dummy.c} "lto-12b.exe" "lto-12.out" "" "c"] \
[list "LTO 13" \
"-O -flto -fuse-linker-plugin tmpdir/lto-13a.o tmpdir/liblto-13.a tmpdir/lto-13b.o" "" \
{dummy.c} "lto-13.exe" "lto-13.out" "" "c"] \
[list "LTO 14" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-14a.o -Wl,--whole-archive tmpdir/liblto-14.a -Wl,--no-whole-archive tmpdir/lto-14b.o" "" \
{dummy.c} "lto-14.exe" "lto-14.out" "" "c"] \
[list "LTO 15" \
"-O2 -flto -fuse-linker-plugin -Wl,--start-group tmpdir/liblto-15.a tmpdir/lto-15a.o -Wl,--end-group" "" \
{dummy.c} "lto-15.exe" "lto-15.out" "" "c"] \
[list "PR ld/13066" \
"-O2 -flto -fuse-linker-plugin" "" \
{pr13066.cc} "pr13066.exe" "pr13066.out" "" "c++"] \
[list "PR ld/13201" \
"-O2 -flto -fuse-linker-plugin -Wl,--as-needed tmpdir/pr13201.o -lm" "" \
{dummy.c} "pr13201.exe" "pr13201.out" "" "c"] \
[list "PR ld/15323 (3)" \
"-O2 -flto -fuse-linker-plugin tmpdir/pr15323a.o" "" \
{pr15323b.c} "pr15323.exe" "pr15323.out" "-flto -O2" "c"] \
[list "PR ld/15323 (4)" \
"-O2 -flto tmpdir/pr15323a-r.o" "" \
{dummy.c} "pr15323a.exe" "pr15323.out" "-flto -O2" "c"] \
[list "PR ld/19317 (3)" \
"-O2 -flto tmpdir/pr19317-r.o" "" \
{dummy.c} "pr19317.exe" "pr19317.out" "-flto -O2" "c"] \
[list "Run pr20276" \
"-O2 -flto tmpdir/pr20276a.o tmpdir/pr20276b.o" "" \
{dummy.c} "pr20276" "pass.out" "-flto -O2" "c"] \
[list "Run pr20267a" \
"-O2 -flto tmpdir/pr20267a.o tmpdir/libpr20267a.a" "" \
{dummy.c} "pr20267a" "pass.out" "-flto -O2" "c"] \
[list "Run pr20267b" \
"-O2 -flto tmpdir/pr20267a.o tmpdir/libpr20267b.a" "" \
{dummy.c} "pr20267b" "pass.out" "-flto -O2" "c"] \
]
if { [at_least_gcc_version 4 7] } {
set lto_run_tests [concat $lto_run_tests [list \
[list "PR ld/12942 (1)" \
"-O2 -flto -fuse-linker-plugin tmpdir/pr12942a.o tmpdir/pr12942b.o" "" \
{dummy.c} "pr12942a.exe" "pr12942.out" "" "c++"] \
[list "PR ld/12942 (2)" \
"-O2 -flto -fuse-linker-plugin tmpdir/pr12942a.o tmpdir/pr12942c.o" "" \
{dummy.c} "pr12942c.exe" "pr12942.out" "" "c++"] \
]]
}
# LTO run-time tests for ELF which require shared library support.
set lto_run_elf_shared_tests [list \
[list "LTO 7" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-7b.o tmpdir/lto-7c.o tmpdir/lto-7a.o -Wl,--no-as-needed tmpdir/liblto-7.so" "" \
{dummy.c} "lto-7.exe" "lto-7.out" "" "c"] \
[list "Run pr21382" \
"-O2 -flto -fuse-linker-plugin -Wl,--as-needed tmpdir/pr21382a.o tmpdir/pr21382.so" "" \
{dummy.c} "pr21382.exe" "pass.out" "" "c"] \
]
# LTO run-time tests for ELF
set lto_run_elf_tests [list \
[list "LTO 8" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-8b.o tmpdir/lto-8a.o" "" \
{dummy.c} "lto-8.exe" "lto-8.out" "" "c"] \
[list "LTO TLS IE" \
"-O2 -flto -fuse-linker-plugin" "" \
{run-ie.c} "run-ie.exe" "run-ie.out" "" "c"] \
]
run_cc_link_tests $lto_link_tests
# These compilation tests generate intermediate object files which will be used
# by some elf tests besides shared libs tests. So, always compile them.
run_cc_link_tests $lto_compile_elf_tests
# Restrict these to ELF targets that support shared libs and PIC.
if { [is_elf_format] && [check_lto_shared_available] } {
run_cc_link_tests $lto_link_elf_tests
set testname "PR ld/15146 (2)"
set exec_output [run_host_cmd "$CC" "-O2 -flto -fuse-linker-plugin -Wl,-rpath-link,. -Wl,--no-copy-dt-needed-entries -Wl,--no-as-needed tmpdir/pr15146d.o tmpdir/pr15146c.so"]
if { [ regexp "undefined reference to symbol '\\.?xxx'" $exec_output ] } {
pass $testname
} {
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"
remote_file host delete "tmpdir/liblto-11.a"
set catch_output [run_host_cmd "$ar" "rc $plug_opt tmpdir/liblto-11.a tmpdir/lto-11a.o tmpdir/lto-11b.o tmpdir/lto-11c.o"]
if {![string match "" $catch_output]} {
unresolved $testname
restore_notify
return
}
if { [at_least_gcc_version 4 7] } {
# Check expected LTO linker errors.
# Since the asm symbol name hack in pr12365b.c doesn't work on all
# targets, run PR ld/12365 tests only for known targets.
if { ([istarget "i?86-*-elf*"]
|| (([istarget "i?86-*-linux*"] || [istarget "i?86-*-gnu*"])
&& ![istarget "*-*-*aout*"]
&& ![istarget "*-*-*oldld*"])
|| [istarget "i?86-*-nacl*"]
|| [istarget "x86_64-*-nacl*"]
|| [istarget "x86_64-*-linux*"]
|| [istarget "amd64-*-linux*"]) } {
set testname "PR ld/12365"
set exec_output [run_host_cmd "$CC" "-O2 -flto -flto-partition=none -fuse-linker-plugin -o tmpdir/pr12365 tmpdir/pr12365a.o tmpdir/pr12365b.o tmpdir/pr12365c.o"]
if { [ regexp "undefined reference to `my_bcopy'" $exec_output ] } {
# Linker should catch the reference to undefined `my_bcopy'
# error caused by a GCC bug.
pass $testname
} elseif { [ string match "" $exec_output ] } {
global READELF
set exec_output [run_host_cmd "$READELF" "-s -W tmpdir/pr12365"]
if { [ regexp "my_bcopy" $exec_output ] } {
# Verify that there is no `my_bcopy' symbol in executable.
fail $testname
} {
pass $testname
}
} {
fail $testname
}
}
set testname "PR ld/12942 (3)"
set exec_output [run_host_cmd "$CXX" "-O2 -flto -fuse-linker-plugin tmpdir/pr12942b.o tmpdir/pr12942a.o"]
if { [ regexp "undefined reference to `\\.?link_error\\(\\)'" $exec_output ] } {
pass $testname
} {
fail $testname
}
}
# Run "ld -r" to generate inputs for complex LTO tests.
run_dump_test "lto-3r"
remote_exec host "mv" "tmpdir/dump tmpdir/lto-3.o"
run_dump_test "lto-5r"
remote_exec host "mv" "tmpdir/dump tmpdir/lto-5.o"
run_cc_link_tests $lto_link_symbol_tests
run_ld_link_tests [list \
[list "PR ld/19317 (2)" \
"-r tmpdir/pr19317.o" "" "" \
{dummy.s} {} "pr19317-r.o"] \
]
run_ld_link_exec_tests $lto_run_tests
if { [is_elf_format] } {
run_ld_link_exec_tests $lto_run_elf_tests
}
if { [is_elf_format] && [check_lto_shared_available] } {
run_ld_link_exec_tests $lto_run_elf_shared_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