Add and use check_lto_shared_available
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 9 Jan 2014 17:01:53 +0000 (09:01 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 9 Jan 2014 17:01:53 +0000 (09:01 -0800)
2014-01-09  Vidya Praveen  <vidyapraveen@arm.com>

* lib/ld-lib.exp (check_lto_shared_available): New check.
* ld-plugin/lto.exp: Use check_lto_shared_available.

ld/testsuite/ChangeLog
ld/testsuite/ld-plugin/lto.exp
ld/testsuite/lib/ld-lib.exp

index 8d32d28..df2e1b8 100644 (file)
@@ -1,3 +1,8 @@
+2014-01-09  Vidya Praveen  <vidyapraveen@arm.com>
+
+       * lib/ld-lib.exp (check_lto_shared_available): New check.
+       * ld-plugin/lto.exp: Use check_lto_shared_available.
+
 2014-01-08  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/14207
index 69946de..d55dca4 100644 (file)
@@ -300,8 +300,7 @@ set lto_run_elf_tests {
 run_cc_link_tests $lto_link_tests
 
 # Restrict these to ELF targets that support shared libs and PIC.
-if { [is_elf_format]
-     && [run_host_cmd_yesno $CC "-shared -fPIC $srcdir/$subdir/dummy.c -o tmpdir/t.so"] } {
+if { [is_elf_format] && [check_lto_shared_available] } {
     run_cc_link_tests $lto_link_elf_tests
     set testname "PR ld/15146 (2)"
     set exec_output [run_host_cmd "$CC" "$gcc_gas_flag $gcc_ld_flag -O2 -flto -fuse-linker-plugin -Wl,-rpath-link,. -Wl,--no-copy-dt-needed-entries -Wl,--no-as-needed tmpdir/pr15146d.o tmpdir/pr15146c.so"]
index c04b56f..54b617f 100644 (file)
@@ -1679,6 +1679,45 @@ proc check_lto_available { } {
     return $lto_available_saved
 }
 
+# Returns true if the target compiler supports LTO and -shared
+proc check_lto_shared_available { } {
+    global lto_shared_available_saved
+    global CC
+
+    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]"
+    }
+
+    if {![info exists lto_shared_available_saved]} {
+       # Check if gcc supports -flto -fuse-linker-plugin -shared
+       if { [which $CC] == 0 } {
+           set lto_shared_available_saved 0
+           return 0
+       }
+       set basename "lto_shared"
+       set src ${basename}[pid].c
+       set output ${basename}[pid].so
+       set f [open $src "w"]
+       puts $f ""
+       close $f
+       set status [remote_exec host $CC "$flags -shared -fPIC -B[pwd]/tmpdir/ld/ -flto -fuse-linker-plugin $src -o $output"]
+       if { [lindex $status 0] == 0 } {
+           set lto_shared_available_saved 1
+       } else {
+           set lto_shared_available_saved 0
+       }
+       file delete $src
+       file delete $output
+    }
+    return $lto_shared_available_saved
+}
+
 # Check if the assembler supports CFI statements.
 
 proc check_as_cfi { } {