]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/24475 (gcc.dg/tls/pr24428.c execution test and gcc.dg/tls/pr24428-2...
authorUros Bizjak <uros@kss-loka.si>
Thu, 1 Dec 2005 06:52:11 +0000 (07:52 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Thu, 1 Dec 2005 06:52:11 +0000 (07:52 +0100)
PR target/24475
* lib/target-supports.exp (check_effective_target_tls): New.
(check_effective_target_tls_runtime): New.
* gcc.dg/tls/tls.exp, g++.dg/tls/tls.exp: Remove check
for TLS support.
* gcc.dg/tls/opt-1.c, gcc.dg/tls/opt-2.c, gcc.dg/tls/opt-3.c,
gcc.dg/tls/opt-4.c, gcc.dg/tls/opt-5.c, gcc.dg/tls/opt-6.c,
gcc.dg/tls/opt-7.c, gcc.dg/tls/opt-8.c, gcc.dg/tls/opt-9.c,
gcc.dg/tls/opt-10.c, gcc.dg/tls/diag-1.c, gcc.dg/tls/diag-2.c,
gcc.dg/tls/diag-3.c, gcc.dg/tls/diag-4.c, gcc.dg/tls/diag-5.c,
gcc.dg/tls/alias-1.c, gcc.dg/tls/alpha-1.c, gcc.dg/tls/asm-1.c,
gcc.dg/tls/debug-1.c, gcc.dg/tls/init-1.c, gcc.dg/tls/nonpic-1.c,
gcc.dg/tls/pic-1.c, gcc.dg/tls/section-1.c, gcc.dg/tls/struct-1.c,
gcc.dg/tls/trivial.c, g++.dg/tls/diag-1.C, g++.dg/tls/diag-2.C,
g++.dg/tls/diag-3.C, g++.dg/tls/diag-4.C, g++.dg/tls/init-1.C,
g++.dg/tls/init-2.C, g++.dg/tls/trivial.C: Require
effective-target TLS.
* gcc.dg/tls/pr24428-2.c, gcc.dg/tls/pr24428.c, gcc.dg/tls/opt-11.c,
g++.dg/tls/static-1a.cc, g++.dg/tls/static-1.C: Require
effective-target TLS runtime.

From-SVN: r107804

41 files changed:
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tls/diag-1.C
gcc/testsuite/g++.dg/tls/diag-2.C
gcc/testsuite/g++.dg/tls/diag-3.C
gcc/testsuite/g++.dg/tls/diag-4.C
gcc/testsuite/g++.dg/tls/init-1.C
gcc/testsuite/g++.dg/tls/init-2.C
gcc/testsuite/g++.dg/tls/static-1.C
gcc/testsuite/g++.dg/tls/static-1a.cc
gcc/testsuite/g++.dg/tls/tls.exp
gcc/testsuite/g++.dg/tls/trivial.C
gcc/testsuite/gcc.dg/tls/alias-1.c
gcc/testsuite/gcc.dg/tls/alpha-1.c
gcc/testsuite/gcc.dg/tls/asm-1.c
gcc/testsuite/gcc.dg/tls/debug-1.c
gcc/testsuite/gcc.dg/tls/diag-1.c
gcc/testsuite/gcc.dg/tls/diag-2.c
gcc/testsuite/gcc.dg/tls/diag-3.c
gcc/testsuite/gcc.dg/tls/diag-4.c
gcc/testsuite/gcc.dg/tls/diag-5.c
gcc/testsuite/gcc.dg/tls/init-1.c
gcc/testsuite/gcc.dg/tls/nonpic-1.c
gcc/testsuite/gcc.dg/tls/opt-1.c
gcc/testsuite/gcc.dg/tls/opt-10.c
gcc/testsuite/gcc.dg/tls/opt-11.c
gcc/testsuite/gcc.dg/tls/opt-2.c
gcc/testsuite/gcc.dg/tls/opt-3.c
gcc/testsuite/gcc.dg/tls/opt-4.c
gcc/testsuite/gcc.dg/tls/opt-5.c
gcc/testsuite/gcc.dg/tls/opt-6.c
gcc/testsuite/gcc.dg/tls/opt-7.c
gcc/testsuite/gcc.dg/tls/opt-8.c
gcc/testsuite/gcc.dg/tls/opt-9.c
gcc/testsuite/gcc.dg/tls/pic-1.c
gcc/testsuite/gcc.dg/tls/pr24428-2.c
gcc/testsuite/gcc.dg/tls/pr24428.c
gcc/testsuite/gcc.dg/tls/section-1.c
gcc/testsuite/gcc.dg/tls/struct-1.c
gcc/testsuite/gcc.dg/tls/tls.exp
gcc/testsuite/gcc.dg/tls/trivial.c
gcc/testsuite/lib/target-supports.exp

index ce4d728fd414ae061e5d3d064c4d8447ff903611..d55401dd796d88dc0f8516feeb4c9843441138eb 100644 (file)
@@ -1,3 +1,26 @@
+2005-12-01  Uros Bizjak  <uros@kss-loka.si>
+
+       PR target/24475
+       * lib/target-supports.exp (check_effective_target_tls): New.
+       (check_effective_target_tls_runtime): New.
+       * gcc.dg/tls/tls.exp, g++.dg/tls/tls.exp: Remove check
+       for TLS support.
+       * gcc.dg/tls/opt-1.c, gcc.dg/tls/opt-2.c, gcc.dg/tls/opt-3.c,
+       gcc.dg/tls/opt-4.c, gcc.dg/tls/opt-5.c, gcc.dg/tls/opt-6.c,
+       gcc.dg/tls/opt-7.c, gcc.dg/tls/opt-8.c, gcc.dg/tls/opt-9.c,
+       gcc.dg/tls/opt-10.c, gcc.dg/tls/diag-1.c, gcc.dg/tls/diag-2.c,
+       gcc.dg/tls/diag-3.c, gcc.dg/tls/diag-4.c, gcc.dg/tls/diag-5.c,
+       gcc.dg/tls/alias-1.c, gcc.dg/tls/alpha-1.c, gcc.dg/tls/asm-1.c,
+       gcc.dg/tls/debug-1.c, gcc.dg/tls/init-1.c, gcc.dg/tls/nonpic-1.c,
+       gcc.dg/tls/pic-1.c, gcc.dg/tls/section-1.c, gcc.dg/tls/struct-1.c,
+       gcc.dg/tls/trivial.c, g++.dg/tls/diag-1.C, g++.dg/tls/diag-2.C,
+       g++.dg/tls/diag-3.C, g++.dg/tls/diag-4.C, g++.dg/tls/init-1.C,
+       g++.dg/tls/init-2.C, g++.dg/tls/trivial.C: Require
+       effective-target TLS.
+       * gcc.dg/tls/pr24428-2.c, gcc.dg/tls/pr24428.c, gcc.dg/tls/opt-11.c, 
+       g++.dg/tls/static-1a.cc, g++.dg/tls/static-1.C: Require
+       effective-target TLS runtime.
+
 2005-12-01  Uros Bizjak  <uros@kss-loka.si>
 
        * lib/gcov.exp (clean-gcov): Also remove $base.h.gcov files.
index 697d0b13106b5130e03bd0c6a250802d4680ac46..af538719d243732d3ef9fe3580346bae57a54f46 100644 (file)
@@ -1,4 +1,5 @@
-/* Valid __thread specifiers.  */
+// Valid __thread specifiers.
+// { dg-require-effective-target tls }
 
 __thread int g1;
 extern __thread int g2;
index 293409db9ce5003b26970b35e86044317032c8bd..484b18845150cb90346061b3a14ffd99818190e7 100644 (file)
@@ -1,4 +1,5 @@
 /* Invalid __thread specifiers.  */
+/* { dg-require-effective-target tls } */
 
 __thread extern int g1;                /* { dg-error "'__thread' before 'extern'" } */
 __thread static int g2;                /* { dg-error "'__thread' before 'static'" } */
index ae2b6ce211fb3825b7cce00c767925ee457b2024..ea5158b898fff486c82664677636391e03e5bb72 100644 (file)
@@ -1,4 +1,5 @@
 // Report invalid extern and __thread combinations.
+// { dg-require-effective-target tls }
 
 extern int j;          // { dg-error "previously declared here" }
 __thread int j;                // { dg-error "follows non-thread-local" }
index 3b840f1e7b9131b1c4839829682277653f3bfc5b..55e985e9261da7029b5b23d7f5284ea4bf117e5f 100644 (file)
@@ -1,4 +1,5 @@
 /* Invalid __thread specifiers.  */
+/* { dg-require-effective-target tls } */
 
 __thread typedef int g4;       /* { dg-error "multiple storage classes" } */
 
index 74f7641fe27469a70050fa57330a31d970e5ad3e..97867123a95f70f0aab0c8c10b46dea0b0d095cb 100644 (file)
@@ -1,4 +1,5 @@
 /* Valid initializations.  */
+/* { dg-require-effective-target tls } */
 
 __thread int i = 42;
 
index 4cc31c909ac88fa71aa7f79bf929edf9d53e1947..c9f646d3a1d93db2f4f1dbd71ea5304131be0fb5 100644 (file)
@@ -1,4 +1,5 @@
 /* Invalid initializations.  */
+/* { dg-require-effective-target tls } */
 
 extern __thread int i;
 __thread int *p = &i;  /* { dg-error "dynamically initialized" } */
index 3cbcbec2d31555252c832b51d064e58ecf1b0735..2392c6346190fa77362ea5198674f3490b2c0074 100644 (file)
@@ -1,6 +1,7 @@
 // { dg-do run }
 // { dg-options "-O2" }
 // { dg-additional-sources "static-1a.cc" }
+// { dg-require-effective-target tls_runtime }
 
 extern "C" void abort ();
 extern int test ();
index c87efdb8ecd1b0df55fa563e6e8504c009eaa9a4..636f9352d4d446a8b1b0f1ebb49a1c5c78754f49 100644 (file)
@@ -1,6 +1,7 @@
 // { dg-do run }
 // { dg-options "-O2" }
 // { dg-additional-sources "static-1a.cc" }
+// { dg-require-effective-target tls_runtime }
 
 struct A
 {
index 20c2bd35bcfc2fab3ab02ee4af01a217da52acc0..85e7a36fa7cd3e728b39784b0ba38059b2d43de5 100644 (file)
@@ -1,4 +1,4 @@
-#   Copyright (C) 2002 Free Software Foundation, Inc.
+#   Copyright (C) 2002, 2005 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # Load support procs.
 load_lib g++-dg.exp
 
-# Test for thread-local data supported by the platform.  If it
-# isn't, everything will fail with the "not supported" message.
-
-set comp_output [g++_target_compile \
-               "$srcdir/$subdir/trivial.C" "trivialx.S" assembly ""]
-remove-build-file "trivialx.S"
-if { [string match "*not supported*" $comp_output] } {
-  return 0
-}
-
 # If a testcase doesn't have special options, use these.
 global DEFAULT_CXXFLAGS
 if ![info exists DEFAULT_CXXFLAGS] then {
index 1fd70631f33b78379c81232b8e5e8f8ab1094618..e2b8f45b84543d3b1ccce19342d915e195b7d1b5 100644 (file)
@@ -1 +1,3 @@
+// { dg-require-effective-target tls }
+
 __thread int i;
index 1098190ebd04acb16f6b7a7f690f28048b39601b..28cb47e504190dcac02a68636152c250eb1ad0f9 100644 (file)
@@ -1,6 +1,7 @@
 /* { dg-do link } */
 /* { dg-require-alias "" } */
 /* { dg-require-visibility "" } */
+/* { dg-require-effective-target tls } */
 /* Test that encode_section_info handles the change from externally
    defined to locally defined (via hidden).   Extracted from glibc.  */
 
index 4bb911f74a1e04c82fe73bd8c9b39ee22f1ee4d4..1d15cb1681cbc1a8f83c65906999dfd795280ae2 100644 (file)
@@ -1,6 +1,7 @@
 /* Make sure that we honor initial-exec.  */
 /* { dg-do compile { target alpha*-*-* } } */
 /* { dg-options "" } */
+/* { dg-require-effective-target tls } */
 
 static __thread int xyzzy __attribute__ ((tls_model ("initial-exec")));
 int foo(void) { return xyzzy; }
index 476fe7cbb72e5c792cdd0f1a8a15f05081d60d25..b77e550d7bf7f29976b3f5e8d6242182379a1170 100644 (file)
@@ -1,4 +1,5 @@
 /* { dg-options "-Werror" } */
+/* { dg-require-effective-target tls } */
 __thread int i;
 
 int foo ()
index 719f0645771ae608dbe6dbb655163f86f4e74938..67d7be69cc50c8be3658c30440dce591e61b3449 100644 (file)
@@ -1,4 +1,5 @@
 /* { dg-do assemble } */
 /* { dg-options "-g" } */
+/* { dg-require-effective-target tls } */
 
 __thread int i;
index ae4f3d4a3c28c7e9b21f58724078572f5fc2b020..56b570c94a5c74803232ad254ba9e661fe429a34 100644 (file)
@@ -1,4 +1,5 @@
 /* Valid __thread specifiers.  */
+/* { dg-require-effective-target tls } */
 
 __thread int g1;
 extern __thread int g2;
index 5e7e17bee5ab64144f2c64ef8bff08a66fa364f9..8276cb3be4902553c2da9b5d64685480bcf9e51a 100644 (file)
@@ -1,4 +1,5 @@
 /* Invalid __thread specifiers.  */
+/* { dg-require-effective-target tls } */
 
 __thread extern int g1;                /* { dg-error "'__thread' before 'extern'" } */
 __thread static int g2;                /* { dg-error "'__thread' before 'static'" } */
index f1ce06b70d8f8e6c406a0e19b0fc4a928b89c11c..45d89b43722b74566620b43767408c45282fb043 100644 (file)
@@ -1,4 +1,5 @@
 /* Report invalid extern and __thread combinations.  */
+/* { dg-require-effective-target tls } */
 
 extern int j;          /* { dg-error "previous declaration" } */
 __thread int j;                /* { dg-error "follows non-thread-local" } */
index df3705d04ee2f1f3c6f4ff621cff7016ccf1efe9..fed2f3accd33fcfd9e9a341b479b8ac302df760f 100644 (file)
@@ -1,5 +1,6 @@
 /* Invalid __thread specifiers.  As diag-4.c but some cases in
    different orders.  */
+/* { dg-require-effective-target tls } */
 
 __thread typedef int g4;       /* { dg-error "'__thread' used with 'typedef'" } */
 
index 623832c3812f5e6bd5a49af0732fdf013260fadd..219396d768ae3fc8eb837cb5694b02a34f2aefb2 100644 (file)
@@ -1,3 +1,4 @@
 /* __thread specifiers on empty declarations.  */
+/* { dg-require-effective-target tls } */
 
 __thread struct foo; /* { dg-warning "warning: useless '__thread' in empty declaration" } */
index 97258643bf2807b56996fb09c72f594501489947..fa4208dce0c1cac31e44f54446e70bfb5ef69678 100644 (file)
@@ -1,4 +1,5 @@
 /* Invalid initializations.  */
+/* { dg-require-effective-target tls } */
 
 extern __thread int i;
 int *p = &i;   /* { dg-error "initializer element is not constant" } */
index 0896df60b56533c9ca475f02e4c4479d71973450..9c592a985563850b4ab8158c8aefa3294155860f 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -ftls-model=initial-exec" } */
+/* { dg-require-effective-target tls } */
 
 extern __thread long e1;
 extern __thread int e2;
index f7dcceee7c88b3431239c86a8c1937c0334d4f2b..5bada6e0929948408f3401f67b9eb54be119fb7a 100644 (file)
@@ -2,6 +2,7 @@
 /* { dg-options "-O2 -fPIC" } */
 /* { dg-options "-O2 -fPIC -mtune=i686" { target { i?86-*-* && ilp32 } } } */
 /* { dg-options "-O2 -fPIC -mtune=i686" { target { x86_64-*-* && ilp32 } } } */
+/* { dg-require-effective-target tls } */
 
 extern __thread int thr;
 
index f31c1fff81627259fd9b1924035beab49c757a44..a710a062ca376113342f8ef7a0b35825d18e13a2 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O3 -fpic" } */
+/* { dg-require-effective-target tls } */
 
 /* The web pass was creating unrecognisable pic_load_dot_plus_four insns
    on ARM.  */
index 5b2cd5c98faa33d324caccb1cf32f300e2c1ad85..3739645257ab02e0fff6b4b3ebbbe33cbf6f0ead 100644 (file)
@@ -1,4 +1,5 @@
 /* { dg-do run } */
+/* { dg-require-effective-target tls_runtime } */
 
 extern void abort (void);
 extern void *memset (void *, int, __SIZE_TYPE__);
index dde54f00674f7db91fdf2696e1328f7cfb67e6bb..fd781ebabd142015190aa3c681eb597560ce4379 100644 (file)
@@ -6,6 +6,7 @@
 /* { dg-options "-O2 -ftls-model=initial-exec" } */
 /* { dg-options "-O2 -ftls-model=initial-exec -march=i686" { target { i?86-*-* && ilp32 } } } */
 /* { dg-options "-O2 -ftls-model=initial-exec -march=i686" { target { x86_64-*-* && ilp32 } } } */
+/* { dg-require-effective-target tls } */
 
 __thread int thr;
 
index 8e476f657e8e14689fac6181d4879d1d17302816..e59e5110b5be95528582618c74ec611f1803bfa5 100644 (file)
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -fpic" } */
 /* { dg-options "-O2 -fpic -mregparm=3" { target i?86-*-* } } */
+/* { dg-require-effective-target tls } */
 
 extern __thread int i, j, k;
 extern void bar(int *, int *, int *);
index 3a95688963b20723b8210154e12dbf6d3a37a4eb..aa59ee7fabf083780814b0276965bc6a8c9769dd 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2" } */
+/* { dg-require-effective-target tls } */
 
 struct A
 {
index d8a686ddb462037366c09972a836caa7e8d0709d..0604f3253c11cc50e2fd428ac6f242bbafe5ff90 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2" } */
+/* { dg-require-effective-target tls } */
 /* Sched1 moved {load_tp} pattern between strlen call and the copy
    of the hard return value to its pseudo.  This resulted in a
    reload abort, since the hard register was not spillable.  */
index de04c1cb3fc494822ef279b9f1fc124919dfbe76..8a01c019c10b99cc4e9080ea268ff8fa7d59b94e 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2" } */
+/* { dg-require-effective-target tls } */
 
 extern void abort (void);
 extern void exit (int);
index beb2c2622d40aaa5e7531297aa8bb9a1d97c513a..c345068a2033cac5fdf4cbdb3467d5cf7163add1 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -fPIC" } */
+/* { dg-require-effective-target tls } */
 
 static __thread void *baz [4] __attribute__((tls_model ("initial-exec")));
 void foo (void)
index dec0eabcb4ce749ebeb4dbb356cc3113bbc800eb..a7331115352c632de00727174fa651717fac326d 100644 (file)
@@ -1,6 +1,7 @@
 /* PR 18910 */
 /* { dg-do compile } */
 /* { dg-options "-O2" } */
+/* { dg-require-effective-target tls } */
 
 static __thread void *foo [2];
 void
index 3829c66fc559e93c9b874427d55fedfff8fde0d2..cc62ef57a5dfd0ff41346a063bd33e811e284c3a 100644 (file)
@@ -1,6 +1,7 @@
 /* PR 21412 */
 /* { dg-do compile */
 /* { dg-options "-O2 -fPIC" } */
+/* { dg-require-effective-target tls } */
 
 struct S { int x[10]; };
 extern __thread struct S s;
index f5b020b7db601f4434df35b29720ce607b4a44e9..bcd42bd8572cef972854a7faddd06b87852d92ab 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -fpic -ftls-model=global-dynamic" } */
+/* { dg-require-effective-target tls } */
 
 extern __thread long e1;
 extern __thread int e2;
index 828943c60e55c99bc72ccae2be1409280f89b85a..a0ceecc06243e2c470f13a14ed9513cff9d2456f 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do run } */
 /* { dg-options "-O2" } */
+/* { dg-require-effective-target tls_runtime } */
 
 __thread double thrtest[81];
 int main ()
index 53b1245d5096f8cdb7ae09010b9fbb00ff17e1e2..ecb747ede6de74fb1bb13478c0613abf5c2420f1 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do run } */
 /* { dg-options "-O2" } */
+/* { dg-require-effective-target tls_runtime } */
 
 __thread double thrtest[81];
 int main ()
index 741eadba5366baf3a5bddcc0bbd7f923cee66340..4fc5066b90dcb71b8620aa9d13fb06ffc1c6f3f0 100644 (file)
@@ -1,5 +1,6 @@
 /* Verify that we get errors for trying to put TLS data in 
    sections which can't work.  */
+/* { dg-require-effective-target tls } */
 
 #define A(X)   __attribute__((section(X)))
 
index 11151236d90716ffb5d54e29afa493560402c186..5fd6be439055902d3dfc8892a0d8229dc9fae329 100644 (file)
@@ -2,6 +2,7 @@
    to allow addends for @dtpoff relocs or not.  */
 /* { dg-do compile } */
 /* { dg-options "-O2 -fpic" } */
+/* { dg-require-effective-target tls } */
 
 struct S {
   int s0, s1, s2, s3;
index b168a1e61908e9cf77b6ef198f0925a39a3c0229..cd86231c05055c84b94941539f410b9bd4bb5367 100644 (file)
@@ -1,4 +1,4 @@
-#   Copyright (C) 2002 Free Software Foundation, Inc.
+#   Copyright (C) 2002, 2005 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # Load support procs.
 load_lib gcc-dg.exp
 
-# Test for thread-local data supported by the platform.  If it
-# isn't, everything will fail with the "not supported" message.
-
-set comp_output [gcc_target_compile \
-               "$srcdir/$subdir/trivial.c" "trivial.S" assembly ""]
-remove-build-file "trivial.S"
-if { [string match "*not supported*" $comp_output] } {
-  return 0
-}
-
 # If a testcase doesn't have special options, use these.
 global DEFAULT_CFLAGS
 if ![info exists DEFAULT_CFLAGS] then {
index 1fd70631f33b78379c81232b8e5e8f8ab1094618..96b8e49a665c4bd2323ef28269c01ac120e98824 100644 (file)
@@ -1 +1,3 @@
+/* { dg-require-effective-target tls } */
+
 __thread int i;
index bb6352f7c893a4f5f7dc0cf391d0a9d1d442d019..d2400956accf5ae53e1ea086e483f4c436d9cd6f 100644 (file)
@@ -384,6 +384,84 @@ proc check_effective_target_pcc_bitfield_type_matters { } {
     return $et_pcc_bitfield_type_matters_saved
 }
 
+# Return 1 if thread local storage (TLS) is supported, 0 otherwise.
+#
+# This won't change for different subtargets so cache the result.
+
+proc check_effective_target_tls {} {
+    global et_tls_saved
+
+    if [info exists et_tls_saved] {
+       verbose "check_effective_target_tls: using cached result" 2
+    } else {
+       set et_tls_saved 1
+
+       set src tls[pid].c
+       set asm tls[pid].S
+       verbose "check_effective_target_tls: compiling testfile $src" 2
+       set f [open $src "w"]
+       # Compile a small test program.
+       puts $f "__thread int i;\n"
+       close $f
+
+       # Test for thread-local data supported by the platform.
+       set comp_output \
+           [target_compile $src $asm assembly ""]
+       file delete $src
+       if { [string match "*not supported*" $comp_output] } {
+           set et_tls_saved 0
+       }
+       remove-build-file $asm
+    }
+    verbose "check_effective_target_tls: returning $et_tls_saved" 2
+    return $et_tls_saved
+}
+
+# Return 1 if TLS executables can run correctly, 0 otherwise.
+#
+# This won't change for different subtargets so cache the result.
+
+proc check_effective_target_tls_runtime {} {
+    global et_tls_runtime_saved
+
+    if [info exists et_tls_runtime_saved] {
+       verbose "check_effective_target_tls_runtime: using cached result" 2
+    } else {
+       set et_tls_runtime_saved 0
+
+       set src tls_runtime[pid].c
+       set exe tls_runtime[pid].x
+       verbose "check_effective_target_tls_runtime: compiling testfile $src" 2
+       set f [open $src "w"]
+       # Compile a small test program.
+       puts $f "__thread int thr = 0;\n"
+       puts $f "int main(void)\n {\n return thr;\n}"
+       close $f
+
+       set comp_output \
+           [target_compile $src $exe executable ""]
+       file delete $src
+
+       if [string match "" $comp_output] then {
+           # No error messages, everything is OK.
+
+           set result [remote_load target "./$exe" "" ""]
+           set status [lindex $result 0]
+           remote_file build delete $exe
+
+           verbose "check_effective_target_tls_runtime status is <$status>" 2
+
+           if { $status == "pass" } {
+               set et_tls_runtime_saved 1
+           }
+
+           verbose "check_effective_target_tls_runtime: returning $et_tls_runtime_saved" 2
+       }
+    }
+
+    return $et_tls_runtime_saved
+}
+
 # Return 1 if -fpic and -fPIC are supported, as in no warnings or errors
 # emitted, 0 otherwise.  Whether a shared library can actually be built is
 # out of scope for this test.