tls-reload-1.c: New test.
authorRichard Sandiford <rdsandiford@googlemail.com>
Wed, 2 Jan 2013 19:43:07 +0000 (19:43 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 2 Jan 2013 19:43:07 +0000 (19:43 +0000)
gcc/testsuite/
* gcc.dg/torture/tls/tls-reload-1.c: New test.

From-SVN: r194815

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/tls/tls-reload-1.c [new file with mode: 0644]

index faa12fd5a49046e9424a965db6987e0fe8503d06..d5ec024778c68b3fda1a718de5ff113cbe54714f 100644 (file)
@@ -1,3 +1,7 @@
+2013-01-02  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * gcc.dg/torture/tls/tls-reload-1.c: New test.
+
 2013-01-02  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * gcc.dg/torture/fp-int-convert-2.c: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/tls/tls-reload-1.c b/gcc/testsuite/gcc.dg/torture/tls/tls-reload-1.c
new file mode 100644 (file)
index 0000000..464a651
--- /dev/null
@@ -0,0 +1,48 @@
+/* { dg-do run } */
+/* { dg-require-effective-target tls_runtime } */
+
+#define ARRAY(X) X##_array
+#define DECLARE(X) \
+  __thread int X; \
+  __thread int ARRAY(X)[4]; \
+  int *volatile *__attribute__((noinline)) \
+  check##X (int *volatile *y) \
+  { \
+    if (!y || *y++ != &X || *y++ != &ARRAY(X)[3]) \
+      return 0; \
+    return y; \
+  }
+#define COPY(X) *y++ = &X; *y++ = &ARRAY(X)[3];
+#define CHECK(X) y = check##X (y);
+#define A(M, X) M(X##0) M(X##1) M(X##2) M(X##3) M(X##4) M(X##5) M(X##6) M(X##7)
+#define B(M, X) A(M, X##0) A(M, X##1) A(M, X##2)
+#define C(M, X) B(M, X) B(M, X) B(M, X)
+
+#define NM 2
+#define NA (NM * 8)
+#define NB (NA * 3)
+#define NC (NB * 3)
+
+extern void abort (void);
+
+B(DECLARE, tls)
+
+void __attribute__ ((noinline))
+setup (int *volatile *y)
+{
+  C(COPY, tls)
+}
+
+int
+main (void)
+{
+  int *volatile array[NC];
+  int *volatile *y = array;
+  int i;
+
+  setup (array);
+  B(CHECK, tls);
+  if (!y)
+    abort ();
+  return 0;
+}