From fef75122c0fe3abafb99d79a63545c1531f4107c Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 27 Jan 2018 16:04:34 -0800 Subject: [PATCH] Add a testcase for PR ld/22751 Since dummy.o must be placed before -Wl,--whole-archive tmpdir/pr22751.a -Wl,--no-whole-archive to trigger the bug, this patch adds an optional trailing ld options to run_ld_link_exec_tests. PR ld/22751 * testsuite/config/default.exp (INT128_CFLAGS): New. * testsuite/ld-plugin/lto.exp (INT128_CFLAGS): New. Run ld/22751 tests. * testsuite/ld-plugin/pr22751.c: New file. * testsuite/lib/ld-lib.exp (run_ld_link_exec_tests): Add ld trailing options. --- ld/ChangeLog | 10 +++++++++ ld/testsuite/config/default.exp | 37 ++++++++++++++++++++++++++++++++ ld/testsuite/ld-plugin/lto.exp | 9 ++++++++ ld/testsuite/ld-plugin/pr22751.c | 17 +++++++++++++++ ld/testsuite/lib/ld-lib.exp | 6 ++++-- 5 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 ld/testsuite/ld-plugin/pr22751.c diff --git a/ld/ChangeLog b/ld/ChangeLog index f32b42fa904..d1de69843f4 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,13 @@ +2018-01-27 H.J. Lu + + PR ld/22751 + * testsuite/config/default.exp (INT128_CFLAGS): New. + * testsuite/ld-plugin/lto.exp (INT128_CFLAGS): New. + Run ld/22751 tests. + * testsuite/ld-plugin/pr22751.c: New file. + * testsuite/lib/ld-lib.exp (run_ld_link_exec_tests): Add + ld trailing options. + 2018-01-28 Alan Modra PR 22751 diff --git a/ld/testsuite/config/default.exp b/ld/testsuite/config/default.exp index 29c020ffa46..fe3bd3204aa 100644 --- a/ld/testsuite/config/default.exp +++ b/ld/testsuite/config/default.exp @@ -376,3 +376,40 @@ if { ![info exists GNU2_CFLAGS] } then { set GNU2_CFLAGS "" } } + +# Set INT128_CFLAGS to "-DHAS_INT128" if target compiler supports __int128. + +if { ![info exists INT128_CFLAGS] } then { + if { [which $CC] != 0 } { + # Check if gcc supports __int128. + set flags "" + if [board_info [target_info name] exists cflags] { + append flags " [board_info [target_info name] cflags]" + } + if [board_info [target_info name] exists ldflags] { + append flags " [board_info [target_info name] ldflags]" + } + + set basename "tmpdir/int128[pid]" + set src ${basename}.c + set output ${basename}.o + set f [open $src "w"] + puts $f "__int128 a = 42;" + close $f + if [is_remote host] { + set src [remote_download host $src] + } + set int128_available [run_host_cmd_yesno "$CC" "$flags -c $src -o $output"] + remote_file host delete $src + remote_file host delete $output + file delete $src + + if { $int128_available == 1 } then { + set INT128_CFLAGS "-DHAS_INT128" + } else { + set INT128_CFLAGS "" + } + } else { + set INT128_CFLAGS "" + } +} diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp index 896f453def1..7300f481f31 100644 --- a/ld/testsuite/ld-plugin/lto.exp +++ b/ld/testsuite/ld-plugin/lto.exp @@ -29,6 +29,8 @@ if { ![check_plugin_api_available] return } +global INT128_CFLAGS + global CFLAGS global CXXFLAGS set saved_CFLAGS "$CFLAGS" @@ -214,6 +216,9 @@ set lto_link_tests [list \ [list "Build pr22502b.o" \ "$plug_opt" "-flto $lto_no_fat" \ {pr22502b.c}] \ + [list "Build pr22751.a" \ + "$plug_opt" "-flto $lto_no_fat $INT128_CFLAGS" \ + {pr22751.c} {} "pr22751.a"] \ ] if { [at_least_gcc_version 4 7] } { @@ -400,6 +405,10 @@ set lto_run_tests [list \ [list "Run pr22502" \ "-O2 -flto tmpdir/pr22502a.o tmpdir/pr22502b.o" "" \ {dummy.c} "pr20267" "pass.out" "-flto -O2" "c"] \ + [list "Run pr22751" \ + "-O2 -flto" "" \ + {dummy.c} "pr22751" "pass.out" "-flto -O2" "c" "" \ + "-Wl,--whole-archive tmpdir/pr22751.a -Wl,--no-whole-archive"] \ ] if { [at_least_gcc_version 4 7] } { diff --git a/ld/testsuite/ld-plugin/pr22751.c b/ld/testsuite/ld-plugin/pr22751.c new file mode 100644 index 00000000000..33c1bf32eb1 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr22751.c @@ -0,0 +1,17 @@ +#include + +#ifdef HAS_INT128 +volatile __int128 a = 42; +volatile __int128 b = 1; +#else +volatile long long a = 42; +volatile long long b = 1; +#endif + +int +main (void) +{ + if (((int) (a / b)) == 42) + printf ("PASS\n"); + return 0; +} diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp index 52baf0b04ce..a892b763984 100644 --- a/ld/testsuite/lib/ld-lib.exp +++ b/ld/testsuite/lib/ld-lib.exp @@ -1377,7 +1377,7 @@ if ![string length [info proc prune_warnings]] { # ldtests contains test-items with 3 items followed by 1 lists, 2 items # and 3 optional items: # 0:name -# 1:ld options +# 1:ld leading options, placed before object files # 2:assembler options # 3:filenames of source files # 4:name of output file @@ -1385,6 +1385,7 @@ if ![string length [info proc prune_warnings]] { # 6:compiler flags (optional) # 7:language (optional) # 8:linker warning (optional) +# 9:ld trailing options, placed after object files (optional) # args is an optional list of target triplets to be xfailed. proc run_ld_link_exec_tests { ldtests args } { @@ -1424,6 +1425,7 @@ proc run_ld_link_exec_tests { ldtests args } { set cflags [lindex $testitem 6] set lang [lindex $testitem 7] set warning [lindex $testitem 8] + set ld_after [lindex $testitem 9] set objfiles {} set failed 0 @@ -1466,7 +1468,7 @@ proc run_ld_link_exec_tests { ldtests args } { # compile only pass $testname continue; - } elseif ![$link_proc $link_cmd $binfile "$board_cflags -L$srcdir/$subdir $ld_options $objfiles"] { + } elseif ![$link_proc $link_cmd $binfile "$board_cflags -L$srcdir/$subdir $ld_options $objfiles $ld_after"] { set failed 1 } -- 2.30.2