Add a testcase for PR ld/22751

Message ID 20180127160857.GA12798@gmail.com
State New
Headers show
Series
  • Add a testcase for PR ld/22751
Related show

Commit Message

H.J. Lu Jan. 27, 2018, 4:08 p.m.
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.

This test will fail on master, but pass on binutils-2_30-branch.  OK
for binutils-2_30-branch?  Should I also check it into master?


H.J.
---
	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/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 ++++--
 4 files changed, 67 insertions(+), 2 deletions(-)
 create mode 100644 ld/testsuite/ld-plugin/pr22751.c

-- 
2.14.3

Patch

diff --git a/ld/testsuite/config/default.exp b/ld/testsuite/config/default.exp
index 29c020ffa4..fe3bd3204a 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 896f453def..7300f481f3 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 0000000000..33c1bf32eb
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr22751.c
@@ -0,0 +1,17 @@ 
+#include <stdio.h>
+
+#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 52baf0b04c..a892b76398 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
 	}