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