From 1670f9c1546818c4ffe02e8f460df1c1c4b1601d Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 28 Apr 2017 12:42:05 -0700 Subject: [PATCH] x86: Add run-time tests for -mtls-dialect=gnu2 * testsuite/config/default.exp (GNU2_CFLAGS): New. Set to -mtls-dialect=gnu2 if target compiler supports it. * testsuite/ld-i386/tls.exp: Run -mtls-dialect=gnu2 tests. * testsuite/ld-x86-64/tls.exp: Likewise. * testsuite/ld-i386/tlsdesc1a.c: New file. * testsuite/ld-i386/tlsdesc1b.c: Likewise. * testsuite/ld-x86-64/tlsdesc1a.c: Likewise. * testsuite/ld-x86-64/tlsdesc1b.c: Likewise. --- ld/ChangeLog | 11 ++++++ ld/testsuite/config/default.exp | 37 ++++++++++++++++++ ld/testsuite/ld-i386/tls.exp | 58 +++++++++++++++++++++++++++ ld/testsuite/ld-i386/tlsdesc1a.c | 19 +++++++++ ld/testsuite/ld-i386/tlsdesc1b.c | 8 ++++ ld/testsuite/ld-x86-64/tls.exp | 63 ++++++++++++++++++++++++++++++ ld/testsuite/ld-x86-64/tlsdesc1a.c | 19 +++++++++ ld/testsuite/ld-x86-64/tlsdesc1b.c | 8 ++++ 8 files changed, 223 insertions(+) create mode 100644 ld/testsuite/ld-i386/tlsdesc1a.c create mode 100644 ld/testsuite/ld-i386/tlsdesc1b.c create mode 100644 ld/testsuite/ld-x86-64/tlsdesc1a.c create mode 100644 ld/testsuite/ld-x86-64/tlsdesc1b.c diff --git a/ld/ChangeLog b/ld/ChangeLog index be412ed4992..e15ee0ad63a 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,14 @@ +2017-04-28 H.J. Lu + + * testsuite/config/default.exp (GNU2_CFLAGS): New. Set + to -mtls-dialect=gnu2 if target compiler supports it. + * testsuite/ld-i386/tls.exp: Run -mtls-dialect=gnu2 tests. + * testsuite/ld-x86-64/tls.exp: Likewise. + * testsuite/ld-i386/tlsdesc1a.c: New file. + * testsuite/ld-i386/tlsdesc1b.c: Likewise. + * testsuite/ld-x86-64/tlsdesc1a.c: Likewise. + * testsuite/ld-x86-64/tlsdesc1b.c: Likewise. + 2017-04-28 H.J. Lu * testsuite/ld-elf/shared.exp: Add run-time tests for -z now. diff --git a/ld/testsuite/config/default.exp b/ld/testsuite/config/default.exp index 899943c65d6..f5cb188478a 100644 --- a/ld/testsuite/config/default.exp +++ b/ld/testsuite/config/default.exp @@ -328,3 +328,40 @@ if { ![info exists NOPIE_CFLAGS] || ![info exists NOPIE_LDFLAGS] } then { set NOPIE_LDFLAGS "" } } + +# Set GNU2_CFLAGS to "-mtls-dialect=gnu2" if target compiler supports it. + +if { ![info exists GNU2_CFLAGS] } then { + if { [which $CC] != 0 } { + # Check if gcc supports -mtls-dialect=gnu2 + 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/gnu2[pid]" + set src ${basename}.c + set output ${basename}.o + set f [open $src "w"] + puts $f "__thread int yyy = 100;" + close $f + if [is_remote host] { + set src [remote_download host $src] + } + set gnu2_available [run_host_cmd_yesno "$CC" "$flags -c -mtls-dialect=gnu2 $src -o $output"] + remote_file host delete $src + remote_file host delete $output + file delete $src + + if { $gnu2_available == 1 } then { + set GNU2_CFLAGS "-mtls-dialect=gnu2" + } else { + set GNU2_CFLAGS "" + } + } else { + set GNU2_CFLAGS "" + } +} diff --git a/ld/testsuite/ld-i386/tls.exp b/ld/testsuite/ld-i386/tls.exp index 4430821767b..504b0f671a2 100644 --- a/ld/testsuite/ld-i386/tls.exp +++ b/ld/testsuite/ld-i386/tls.exp @@ -176,3 +176,61 @@ run_ld_link_exec_tests [list \ "pass.out" \ ] \ ] + +run_cc_link_tests [list \ + [list \ + "Build libtlsdesc1.so" \ + "-shared" \ + "-fPIC $GNU2_CFLAGS" \ + { tlsdesc1b.c } \ + {} \ + "libtlsdesc1.so" \ + ] \ + [list \ + "Build libtlsdesc1n.so" \ + "-Wl,-z,now -shared" \ + "-fPIC $GNU2_CFLAGS" \ + { tlsdesc1b.c } \ + {} \ + "libtlsdesc1n.so" \ + ] \ +] + +run_ld_link_exec_tests [list \ + [list \ + "Run tlsdesc1" \ + "-Wl,--no-as-needed tmpdir/libtlsdesc1.so" \ + "" \ + { tlsdesc1a.c } \ + "tlsdesc1a" \ + "pass.out" \ + "$GNU2_CFLAGS" \ + ] \ + [list \ + "Run tlsdesc1 (-z now)" \ + "-Wl,-z,now -Wl,--no-as-needed tmpdir/libtlsdesc1n.so" \ + "" \ + { tlsdesc1a.c } \ + "tlsdesc1b" \ + "pass.out" \ + "$GNU2_CFLAGS" \ + ] \ + [list \ + "Run tlsdesc1 with PIE" \ + "-pie -Wl,--no-as-needed tmpdir/libtlsdesc1.so" \ + "" \ + { tlsdesc1a.c } \ + "tlsdesc1c" \ + "pass.out" \ + "-fPIE $GNU2_CFLAGS" \ + ] \ + [list \ + "Run tlsdesc1 with PIE (-z now)" \ + "-pie -Wl,-z,now -Wl,--no-as-needed tmpdir/libtlsdesc1n.so" \ + "" \ + { tlsdesc1a.c } \ + "tlsdesc1d" \ + "pass.out" \ + "-fPIE $GNU2_CFLAGS" \ + ] \ +] diff --git a/ld/testsuite/ld-i386/tlsdesc1a.c b/ld/testsuite/ld-i386/tlsdesc1a.c new file mode 100644 index 00000000000..7d2f4f634c8 --- /dev/null +++ b/ld/testsuite/ld-i386/tlsdesc1a.c @@ -0,0 +1,19 @@ +#include +#include + +extern int foo (void); + +extern __thread int yyy; + +__thread int zzz = 20; + +int +main (void) +{ + if (foo () != zzz) + abort (); + if (yyy != 100) + abort (); + printf ("PASS\n"); + return 0; +} diff --git a/ld/testsuite/ld-i386/tlsdesc1b.c b/ld/testsuite/ld-i386/tlsdesc1b.c new file mode 100644 index 00000000000..fe428af7000 --- /dev/null +++ b/ld/testsuite/ld-i386/tlsdesc1b.c @@ -0,0 +1,8 @@ +__thread int yyy = 100; +extern __thread int zzz; + +int +foo (void) +{ + return zzz; +} diff --git a/ld/testsuite/ld-x86-64/tls.exp b/ld/testsuite/ld-x86-64/tls.exp index e5786452f44..6b4852bc831 100644 --- a/ld/testsuite/ld-x86-64/tls.exp +++ b/ld/testsuite/ld-x86-64/tls.exp @@ -176,3 +176,66 @@ run_ld_link_exec_tests [list \ "pass.out" \ ] \ ] + +# -mtls-dialect=gnu2 isn't supported on x32. +if [istarget "x86_64-*-linux*-gnux32"] { + return +} + +run_cc_link_tests [list \ + [list \ + "Build libtlsdesc1.so" \ + "-shared" \ + "-fPIC $GNU2_CFLAGS" \ + { tlsdesc1b.c } \ + {} \ + "libtlsdesc1.so" \ + ] \ + [list \ + "Build libtlsdesc1n.so" \ + "-Wl,-z,now -shared" \ + "-fPIC $GNU2_CFLAGS" \ + { tlsdesc1b.c } \ + {} \ + "libtlsdesc1n.so" \ + ] \ +] + +run_ld_link_exec_tests [list \ + [list \ + "Run tlsdesc1" \ + "-Wl,--no-as-needed tmpdir/libtlsdesc1.so" \ + "" \ + { tlsdesc1a.c } \ + "tlsdesc1a" \ + "pass.out" \ + "$GNU2_CFLAGS" \ + ] \ + [list \ + "Run tlsdesc1 (-z now)" \ + "-Wl,-z,now -Wl,--no-as-needed tmpdir/libtlsdesc1n.so" \ + "" \ + { tlsdesc1a.c } \ + "tlsdesc1b" \ + "pass.out" \ + "$GNU2_CFLAGS" \ + ] \ + [list \ + "Run tlsdesc1 with PIE" \ + "-pie -Wl,--no-as-needed tmpdir/libtlsdesc1.so" \ + "" \ + { tlsdesc1a.c } \ + "tlsdesc1c" \ + "pass.out" \ + "-fPIE $GNU2_CFLAGS" \ + ] \ + [list \ + "Run tlsdesc1 with PIE (-z now)" \ + "-pie -Wl,-z,now -Wl,--no-as-needed tmpdir/libtlsdesc1n.so" \ + "" \ + { tlsdesc1a.c } \ + "tlsdesc1d" \ + "pass.out" \ + "-fPIE $GNU2_CFLAGS" \ + ] \ +] diff --git a/ld/testsuite/ld-x86-64/tlsdesc1a.c b/ld/testsuite/ld-x86-64/tlsdesc1a.c new file mode 100644 index 00000000000..7d2f4f634c8 --- /dev/null +++ b/ld/testsuite/ld-x86-64/tlsdesc1a.c @@ -0,0 +1,19 @@ +#include +#include + +extern int foo (void); + +extern __thread int yyy; + +__thread int zzz = 20; + +int +main (void) +{ + if (foo () != zzz) + abort (); + if (yyy != 100) + abort (); + printf ("PASS\n"); + return 0; +} diff --git a/ld/testsuite/ld-x86-64/tlsdesc1b.c b/ld/testsuite/ld-x86-64/tlsdesc1b.c new file mode 100644 index 00000000000..fe428af7000 --- /dev/null +++ b/ld/testsuite/ld-x86-64/tlsdesc1b.c @@ -0,0 +1,8 @@ +__thread int yyy = 100; +extern __thread int zzz; + +int +foo (void) +{ + return zzz; +} -- 2.30.2