diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2025-08-16 14:49:05 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2025-08-18 13:17:24 -0700 |
commit | 258ebe350e6d8ca1fa388a05789bf47f3d9d9fb4 (patch) | |
tree | 8aa8766576914f53f6c25cb41a744fca877b9f2a | |
parent | b6ebe65cdac1afc15d5459318007be2d1d8832d0 (diff) | |
download | binutils-258ebe350e6d8ca1fa388a05789bf47f3d9d9fb4.zip binutils-258ebe350e6d8ca1fa388a05789bf47f3d9d9fb4.tar.gz binutils-258ebe350e6d8ca1fa388a05789bf47f3d9d9fb4.tar.bz2 |
ld: Properly override compiler flags in tests
Some tests need to be compiled with additional flags. When binutils is
built and compiled with
CC="gcc -fsanitize=address,undefined" CXX="g++ -fsanitize=address,undefined"
some linker tests fail to disable address sanitizer options since
proc default_ld_compile has
set ccexe $cc
set ccparm [string first " " $cc]
set ccflags ""
if { $ccparm > 0 } then {
set ccflags [string range $cc $ccparm end]
set ccexe [string range $cc 0 $ccparm]
set cc $ccexe
}
...
set cmd "$cc $flags $ccflags -c $source -o $object"
Compiler flags in $CC and $CXX will be the last ones. Add
CFLAGS_FOR_TARGET_TEST and CXXFLAGS_FOR_TARGET_TEST to use them in
proc default_ld_compile
set cflag_test ""
set cxxflag_test ""
if {[string match "*++*" $ccexe]} {
append flags " $CXXFLAGS_FOR_TARGET"
set cflag_test "$CXXFLAGS_FOR_TARGET_TEST"
} else {
append flags " $CFLAGS_FOR_TARGET"
set cflag_test "$CFLAGS_FOR_TARGET_TEST"
}
...
set cmd "$cc $flags $ccflags $cflag_test -c $source -o $object"
so that they will be the last flags passed to compiler. Also update
run_ld_link_exec_tests and run_cc_link_tests to make
CFLAGS_FOR_TARGET_TEST and CXXFLAGS_FOR_TARGET_TEST the last flags
passed to compiler.
* testsuite/config/default.exp (CFLAGS_FOR_TARGET_TEST): New.
(CXXFLAGS_FOR_TARGET_TEST): Likewise.
* testsuite/ld-elf/dwarf.exp (CFLAGS_FOR_TARGET): Renamed to ...
(CFLAGS_FOR_TARGET_TEST): This.
* testsuite/ld-elf/shared.exp: Save, append and restore
CFLAGS_FOR_TARGET_TEST and CXXFLAGS_FOR_TARGET_TEST for
$build_tests. Save, append and restore CFLAGS_FOR_TARGET_TEST,
instead of CFLAGS_FOR_TARGET, for $dlopen_run_tests.
* testsuite/ld-plugin/plugin.exp (CFLAGS_FOR_TARGET): Renamed to
...
(CFLAGS_FOR_TARGET_TEST): This.
* testsuite/ld-shared/shared.exp (CFLAGS_FOR_TARGET): Renamed to
...
(CFLAGS_FOR_TARGET_TEST): This.
* testsuite/ld-srec/srec.exp (CFLAGS_FOR_TARGET): Renamed to ...
(CFLAGS_FOR_TARGET_TEST): This.
(CXXFLAGS_FOR_TARGET): Renamed to ...
(CXXFLAGS_FOR_TARGET_TEST): This.
* testsuite/lib/ld-lib.exp (default_ld_compile): Append
CFLAGS_FOR_TARGET_TEST/CXXFLAGS_FOR_TARGET_TEST to compiler flags.
(run_ld_link_exec_tests): Append CFLAGS_FOR_TARGET_TEST and
CXXFLAGS_FOR_TARGET_TEST to compiler.
(run_cc_link_tests): Likewise.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
-rw-r--r-- | ld/testsuite/config/default.exp | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/dwarf.exp | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/shared.exp | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-plugin/plugin.exp | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-shared/shared.exp | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-srec/srec.exp | 28 | ||||
-rw-r--r-- | ld/testsuite/lib/ld-lib.exp | 28 |
7 files changed, 60 insertions, 38 deletions
diff --git a/ld/testsuite/config/default.exp b/ld/testsuite/config/default.exp index 1c12ce6..9f28683 100644 --- a/ld/testsuite/config/default.exp +++ b/ld/testsuite/config/default.exp @@ -117,12 +117,18 @@ if {![info exists CC_FOR_TARGET]} { if {![info exists CFLAGS_FOR_TARGET]} { set CFLAGS_FOR_TARGET "-g -O2" } +if {![info exists CFLAGS_FOR_TARGET_TEST]} { + set CFLAGS_FOR_TARGET_TEST "" +} if {![info exists CXX_FOR_TARGET]} { set CXX_FOR_TARGET [find_g++] } if {![info exists CXXFLAGS_FOR_TARGET]} { set CXXFLAGS_FOR_TARGET "" } +if {![info exists CXXFLAGS_FOR_TARGET_TEST]} { + set CXXFLAGS_FOR_TARGET_TEST "" +} # This allows us to run the linker testsuite with clang as the compilation # driver instead of gcc. The syntax of the overrides are as follows, one diff --git a/ld/testsuite/ld-elf/dwarf.exp b/ld/testsuite/ld-elf/dwarf.exp index c7b2915..4f79635 100644 --- a/ld/testsuite/ld-elf/dwarf.exp +++ b/ld/testsuite/ld-elf/dwarf.exp @@ -69,11 +69,11 @@ set run_tests { } # Disable all sanitizers. -set old_CFLAGS "$CFLAGS_FOR_TARGET" -append CFLAGS_FOR_TARGET " $NOSANITIZE_CFLAGS" +set old_CFLAGS "$CFLAGS_FOR_TARGET_TEST" +append CFLAGS_FOR_TARGET_TEST " $NOSANITIZE_CFLAGS" run_cc_link_tests $build_tests run_ld_link_exec_tests $run_tests -set CFLAGS_FOR_TARGET "$old_CFLAGS" +set CFLAGS_FOR_TARGET_TEST "$old_CFLAGS" proc strip_test {} { global ld diff --git a/ld/testsuite/ld-elf/shared.exp b/ld/testsuite/ld-elf/shared.exp index ee881c2..a24525a 100644 --- a/ld/testsuite/ld-elf/shared.exp +++ b/ld/testsuite/ld-elf/shared.exp @@ -972,7 +972,13 @@ append build_tests { {pr26580-b.c} {} "libpr26580-2.so"} } +set old_CFLAGS "$CFLAGS_FOR_TARGET_TEST" +set old_CXXFLAGS "$CXXFLAGS_FOR_TARGET_TEST" +append CFLAGS_FOR_TARGET_TEST " $NOSANITIZE_CFLAGS" +append CXXFLAGS_FOR_TARGET_TEST " $NOSANITIZE_CFLAGS" run_cc_link_tests $build_tests +set CFLAGS_FOR_TARGET_TEST "$old_CFLAGS" +set CXXFLAGS_FOR_TARGET_TEST "$old_CXXFLAGS" run_cc_link_tests [list \ [list \ @@ -1259,10 +1265,10 @@ if [check_libdl_available] { # XFAIL on NetBSD ELF systems as they do not currently support the .*_array # sections. # Disable all sanitizers. - set old_CFLAGS "$CFLAGS_FOR_TARGET" - append CFLAGS_FOR_TARGET " $NOSANITIZE_CFLAGS" + set old_CFLAGS "$CFLAGS_FOR_TARGET_TEST" + append CFLAGS_FOR_TARGET_TEST " $NOSANITIZE_CFLAGS" run_ld_link_exec_tests $dlopen_run_tests "*-*-netbsd*" - set CFLAGS_FOR_TARGET "$old_CFLAGS" + set CFLAGS_FOR_TARGET_TEST "$old_CFLAGS" } # Check --no-add-needed and --no-copy-dt-needed-entries diff --git a/ld/testsuite/ld-plugin/plugin.exp b/ld/testsuite/ld-plugin/plugin.exp index 38a4036..2e148e4 100644 --- a/ld/testsuite/ld-plugin/plugin.exp +++ b/ld/testsuite/ld-plugin/plugin.exp @@ -87,11 +87,11 @@ set regcln "-plugin-opt registercleanup" set failed_compile 0 set _ "" set plugin_nm_output "" -set old_CFLAGS "$CFLAGS_FOR_TARGET" -append CFLAGS_FOR_TARGET " $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" +set old_CFLAGS "$CFLAGS_FOR_TARGET_TEST" +append CFLAGS_FOR_TARGET_TEST " $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" if { [istarget m681*-*-*] || [istarget m68hc1*-*-*] || [istarget m9s12x*-*-*] } { # otherwise get FAILS due to _.frame - append CFLAGS_FOR_TARGET " -fomit-frame-pointer" + append CFLAGS_FOR_TARGET_TEST " -fomit-frame-pointer" } if { $can_compile && \ @@ -291,7 +291,7 @@ if { !$can_compile || $failed_compile } { unsupported [lindex $testitem 0] } } - set CFLAGS_FOR_TARGET "$old_CFLAGS" + set CFLAGS_FOR_TARGET_TEST "$old_CFLAGS" return } @@ -394,4 +394,4 @@ if [ar_simple_create $ar "--plugin $plugin4_path" "tmpdir/libpr20070.a" \ unsupported "PR ld/20070" } -set CFLAGS_FOR_TARGET "$old_CFLAGS" +set CFLAGS_FOR_TARGET_TEST "$old_CFLAGS" diff --git a/ld/testsuite/ld-shared/shared.exp b/ld/testsuite/ld-shared/shared.exp index 29de93a..e7f77fa 100644 --- a/ld/testsuite/ld-shared/shared.exp +++ b/ld/testsuite/ld-shared/shared.exp @@ -67,8 +67,8 @@ set SHCFLAG "" set shared_needs_pic "no" # Disable all sanitizers. -set old_CFLAGS "$CFLAGS_FOR_TARGET" -append CFLAGS_FOR_TARGET " $NOSANITIZE_CFLAGS" +set old_CFLAGS "$CFLAGS_FOR_TARGET_TEST" +append CFLAGS_FOR_TARGET_TEST " $NOSANITIZE_CFLAGS" if { [is_xcoff_format] } { # Not all the useful features are available with AIX shared @@ -104,7 +104,7 @@ if [istarget arm*-*-linux*] { set file [open $tmpdir/movw-detect.c w] puts $file "void foo(void) { __asm (\"movw r0, #0\"); }" close $file - if [run_host_cmd_yesno "$CC_FOR_TARGET" "$CFLAGS_FOR_TARGET -c $tmpdir/movw-detect.c -o $tmpdir/movw-detect.o"] { + if [run_host_cmd_yesno "$CC_FOR_TARGET" "$CFLAGS_FOR_TARGET_TEST -c $tmpdir/movw-detect.c -o $tmpdir/movw-detect.o"] { set shared_needs_pic "yes" } } @@ -343,4 +343,4 @@ if ![ld_compile "$CC_FOR_TARGET $SHCFLAG $picflag" $srcdir/$subdir/main.c $tmpdi } } -set CFLAGS_FOR_TARGET "$old_CFLAGS" +set CFLAGS_FOR_TARGET_TEST "$old_CFLAGS" diff --git a/ld/testsuite/ld-srec/srec.exp b/ld/testsuite/ld-srec/srec.exp index bec5913..5afc84c 100644 --- a/ld/testsuite/ld-srec/srec.exp +++ b/ld/testsuite/ld-srec/srec.exp @@ -365,24 +365,24 @@ if { ![check_compiler_available] } { # tests. Also add $NOPIE_CFLAGS and $NOPIE_LDFLAGS if PIE doesn't work # with S-records. Also add $NOCF_PROTECTION_CFLAGS for S-records. # Also add $NOSANITIZE_CFLAGS for S-records. -set old_CFLAGS "$CFLAGS_FOR_TARGET" -append CFLAGS_FOR_TARGET " $PLT_CFLAGS $NOPIE_CFLAGS $NOPIE_LDFLAGS $NOCF_PROTECTION_CFLAGS $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" -set old_CXXFLAGS "$CXXFLAGS_FOR_TARGET" -append CXXFLAGS_FOR_TARGET " $PLT_CFLAGS $NOPIE_CFLAGS $NOPIE_LDFLAGS $NOCF_PROTECTION_CFLAGS $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" +set old_CFLAGS "$CFLAGS_FOR_TARGET_TEST" +append CFLAGS_FOR_TARGET_TEST " $PLT_CFLAGS $NOPIE_CFLAGS $NOPIE_LDFLAGS $NOCF_PROTECTION_CFLAGS $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" +set old_CXXFLAGS "$CXXFLAGS_FOR_TARGET_TEST" +append CXXFLAGS_FOR_TARGET_TEST " $PLT_CFLAGS $NOPIE_CFLAGS $NOPIE_LDFLAGS $NOCF_PROTECTION_CFLAGS $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" # S-records can't handle .note.gnu.property sections. if { [is_elf_format] \ && ([istarget "i?86-*-*"] || [istarget "x86_64-*-*"]) } { - append CFLAGS_FOR_TARGET " -Wa,-mx86-used-note=no" - append CXXFLAGS_FOR_TARGET " -Wa,-mx86-used-note=no" + append CFLAGS_FOR_TARGET_TEST " -Wa,-mx86-used-note=no" + append CXXFLAGS_FOR_TARGET_TEST " -Wa,-mx86-used-note=no" } if { ![ld_compile $CC_FOR_TARGET $srcdir/$subdir/sr1.c tmpdir/sr1.o] \ || ![ld_compile $CC_FOR_TARGET $srcdir/$subdir/sr2.c tmpdir/sr2.o] } { unsupported $test1 unsupported $test2 - set CFLAGS_FOR_TARGET "$old_CFLAGS" - set CXXFLAGS_FOR_TARGET "$old_CXXFLAGS" + set CFLAGS_FOR_TARGET_TEST "$old_CFLAGS" + set CXXFLAGS_FOR_TARGET_TEST "$old_CXXFLAGS" return } @@ -454,15 +454,15 @@ run_srec_test $test1 "tmpdir/sr1.o tmpdir/sr2.o" if { ![is_remote host] && [which $CXX_FOR_TARGET] == 0 } { untested $test2 - set CFLAGS_FOR_TARGET "$old_CFLAGS" - set CXXFLAGS_FOR_TARGET "$old_CXXFLAGS" + set CFLAGS_FOR_TARGET_TEST "$old_CFLAGS" + set CXXFLAGS_FOR_TARGET_TEST "$old_CXXFLAGS" return } if ![ld_compile "$CXX_FOR_TARGET -fno-exceptions" $srcdir/$subdir/sr3.cc tmpdir/sr3.o] { unsupported $test2 - set CFLAGS_FOR_TARGET "$old_CFLAGS" - set CXXFLAGS_FOR_TARGET "$old_CXXFLAGS" + set CFLAGS_FOR_TARGET_TEST "$old_CFLAGS" + set CXXFLAGS_FOR_TARGET_TEST "$old_CXXFLAGS" return } @@ -488,5 +488,5 @@ setup_xfail "bpf-*-*" run_srec_test $test2 "tmpdir/sr3.o" -set CFLAGS_FOR_TARGET "$old_CFLAGS" -set CXXFLAGS_FOR_TARGET "$old_CXXFLAGS" +set CFLAGS_FOR_TARGET_TEST "$old_CFLAGS" +set CXXFLAGS_FOR_TARGET_TEST "$old_CXXFLAGS" diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp index 22d2f98..d1343eb 100644 --- a/ld/testsuite/lib/ld-lib.exp +++ b/ld/testsuite/lib/ld-lib.exp @@ -253,6 +253,8 @@ proc default_ld_link { ld target objects } { proc default_ld_compile { cc source object } { global CFLAGS_FOR_TARGET global CXXFLAGS_FOR_TARGET + global CFLAGS_FOR_TARGET_TEST + global CXXFLAGS_FOR_TARGET_TEST global srcdir global subdir global host_triplet @@ -286,10 +288,14 @@ proc default_ld_compile { cc source object } { } set ccexe [string replace $ccexe 0 [string last "/" $ccexe] ""] + set cflag_test "" + set cxxflag_test "" if {[string match "*++*" $ccexe]} { append flags " $CXXFLAGS_FOR_TARGET" + set cflag_test "$CXXFLAGS_FOR_TARGET_TEST" } else { append flags " $CFLAGS_FOR_TARGET" + set cflag_test "$CFLAGS_FOR_TARGET_TEST" } if [board_info [target_info name] exists cflags] { @@ -300,7 +306,7 @@ proc default_ld_compile { cc source object } { append flags " [board_info [target_info name] multilib_flags]" } - set cmd "$cc $flags $ccflags -c $source -o $object" + set cmd "$cc $flags $ccflags $cflag_test -c $source -o $object" verbose -log "$cmd" set status [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "ld.tmp"] @@ -727,6 +733,8 @@ proc run_ld_link_exec_tests { ldtests args } { global env global CC_FOR_TARGET global CXX_FOR_TARGET + global CFLAGS_FOR_TARGET_TEST + global CXXFLAGS_FOR_TARGET_TEST global errcnt global exec_output global STATIC_LDFLAGS @@ -780,9 +788,9 @@ proc run_ld_link_exec_tests { ldtests args } { lappend objfiles $objfile if { [ string match "c++" $lang ] } { - set cmd "$CXX_FOR_TARGET -c $cflags" + set cmd "$CXX_FOR_TARGET -c $cflags $CXXFLAGS_FOR_TARGET_TEST" } else { - set cmd "$CC_FOR_TARGET -c $cflags" + set cmd "$CC_FOR_TARGET -c $cflags $CFLAGS_FOR_TARGET_TEST" } if ![ld_compile $cmd $srcdir/$subdir/$src_file $objfile] { set failed 1 @@ -799,10 +807,10 @@ proc run_ld_link_exec_tests { ldtests args } { set link_cmd $ld } elseif { [ string match "c++" $lang ] } { set link_proc ld_link - set link_cmd $CXX_FOR_TARGET + set link_cmd "$CXX_FOR_TARGET $CXXFLAGS_FOR_TARGET_TEST" } else { set link_proc ld_link - set link_cmd $CC_FOR_TARGET + set link_cmd "$CC_FOR_TARGET $CFLAGS_FOR_TARGET_TEST" } if { $binfile eq "tmpdir/" } { @@ -888,6 +896,8 @@ proc run_cc_link_tests { ldtests } { global env global CC_FOR_TARGET global CXX_FOR_TARGET + global CFLAGS_FOR_TARGET_TEST + global CXXFLAGS_FOR_TARGET_TEST global ar global exec_output global STATIC_LDFLAGS @@ -969,9 +979,9 @@ proc run_cc_link_tests { ldtests } { lappend objfiles $objfile if { [ string match "c++" $lang ] } { - set cmd "$CXX_FOR_TARGET -c $cflags" + set cmd "$CXX_FOR_TARGET $CXXFLAGS_FOR_TARGET_TEST -c $cflags" } else { - set cmd "$CC_FOR_TARGET -c $cflags" + set cmd "$CC_FOR_TARGET $CFLAGS_FOR_TARGET_TEST -c $cflags" } if ![ld_compile $cmd $srcdir/$subdir/$src_file $objfile] { set failed 1 @@ -987,9 +997,9 @@ proc run_cc_link_tests { ldtests } { reset_vars if { [ string match "c++" $lang ] } { - set cc_cmd $CXX_FOR_TARGET + set cc_cmd "$CXX_FOR_TARGET $CXXFLAGS_FOR_TARGET_TEST" } else { - set cc_cmd $CC_FOR_TARGET + set cc_cmd "$CC_FOR_TARGET $CFLAGS_FOR_TARGET_TEST" } if { $binfile eq "tmpdir/" } { |