Both C and C++ front ends should set a tentative TLS model in grokvardecl
and update DECL_TLS_MODEL with the default TLS access model after a TLS
variable has been fully processed if the default TLS access model is
stronger.

        PR c/107419
        PR c++/107393
        * c-c++-common/tls-attr-common.c: New test.
        * c-c++-common/tls-attr-le-pic.c: Likewise.
        * c-c++-common/tls-attr-le-pie.c: Likewise.

Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
---
 gcc/testsuite/c-c++-common/tls-attr-common.c | 17 +++++++++++++++++
 gcc/testsuite/c-c++-common/tls-attr-le-pic.c | 15 +++++++++++++++
 gcc/testsuite/c-c++-common/tls-attr-le-pie.c | 15 +++++++++++++++
 3 files changed, 47 insertions(+)
 create mode 100644 gcc/testsuite/c-c++-common/tls-attr-common.c
 create mode 100644 gcc/testsuite/c-c++-common/tls-attr-le-pic.c
 create mode 100644 gcc/testsuite/c-c++-common/tls-attr-le-pie.c

diff --git a/gcc/testsuite/c-c++-common/tls-attr-common.c 
b/gcc/testsuite/c-c++-common/tls-attr-common.c
new file mode 100644
index 00000000000..231d760ab93
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/tls-attr-common.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target fpic } */
+/* { dg-require-effective-target tls } */
+/* { dg-options "-O2 -fno-pic -fdump-ipa-whole-program" } */
+/* { dg-additional-options "-mno-direct-extern-access" { target { i?86-*-* 
x86_64-*-* } } } */
+
+__attribute__((common))
+__thread int i;
+
+int *
+foo (void)
+{
+  return &i;
+}
+
+/* tls_model should be tls-initial-exec due to common attribute.  */
+/* { dg-final { scan-ipa-dump "Varpool flags: tls-initial-exec" 
"whole-program" } } */
diff --git a/gcc/testsuite/c-c++-common/tls-attr-le-pic.c 
b/gcc/testsuite/c-c++-common/tls-attr-le-pic.c
new file mode 100644
index 00000000000..c02df6919f1
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/tls-attr-le-pic.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target fpic } */
+/* { dg-require-effective-target tls } */
+/* { dg-options "-O2 -fpic -fdump-ipa-whole-program" } */
+
+__attribute__ ((tls_model ("local-exec"))) __thread int i;
+
+int *
+foo (void)
+{
+  return &i;
+}
+
+/* tls_model should be local-exec due to tls_model attribute.  */
+/* { dg-final { scan-ipa-dump "Varpool flags: tls-local-exec" "whole-program" 
} } */
diff --git a/gcc/testsuite/c-c++-common/tls-attr-le-pie.c 
b/gcc/testsuite/c-c++-common/tls-attr-le-pie.c
new file mode 100644
index 00000000000..b8ef7840d79
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/tls-attr-le-pie.c
@@ -0,0 +1,15 @@
+/* { dg-do compile { target { tls && pie } } } */
+/* { dg-options "-O2 -fPIE -fdump-ipa-whole-program" } */
+
+extern const int afoo[3];
+
+__thread const int *pfoo __attribute__ ((tls_model ("initial-exec"))) = afoo;
+
+const int **
+ppfoo (void)
+{
+  return &pfoo;
+}
+
+/* tls_model should be local-exec due to -fPIE.  */
+/* { dg-final { scan-ipa-dump "Varpool flags: initialized tls-local-exec" 
"whole-program" } } */
-- 
2.50.1

Reply via email to