This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] Add a testcase for PR ld/22751
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: nickc at redhat dot com
- Cc: binutils at sourceware dot org
- Date: Sat, 27 Jan 2018 08:08:57 -0800
- Subject: [PATCH] Add a testcase for PR ld/22751
- Authentication-results: sourceware.org; auth=none
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
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
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
}
--
2.14.3