+2018-01-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ 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 <amodra@gmail.com>
PR 22751
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 ""
+ }
+}
return
}
+global INT128_CFLAGS
+
global CFLAGS
global CXXFLAGS
set saved_CFLAGS "$CFLAGS"
[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] } {
[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] } {
--- /dev/null
+#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;
+}
# 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
# 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 } {
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
# 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
}