Both C and C++ frontends should set a tentative TLS model in grokvardecl
and update TLS mode 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.tools@gmail.com>
--- /dev/null
+/* { dg-do compile } */
+/* { dg-require-effective-target pie } */
+/* { dg-require-effective-target tls } */
+/* { dg-options "-O2 -fdump-ipa-whole-program" } */
+/* Add -fPIE or -mno-direct-extern-access to disable direct access to
+ external symbol from executable. */
+/* { dg-additional-options "-fPIE" { target { ! { i?86-*-* x86_64-*-* } } } } */
+/* { 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" } } */
--- /dev/null
+/* { 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" } } */
--- /dev/null
+/* { 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" } } */