Don't check tls_model attribute when optimizing TLS access since 1. -ftls-model=initial-exec also can specify tls_model without tls_model attribute. 2. Linker can optimize TLS access at link-time. 3. LTO should perform the similar optimization.
Since C, C++, and Fortran front-ends now set the TLS access model after a variable has been fully processed, not in the middle of processing it, partially revert commit 82e629c26647313be406c41a01e6868cfad0f289 Author: Alexander Monakov <amona...@ispras.ru> Date: Wed Oct 26 16:37:34 2022 +0300 ipa-visibility: remove assert in TLS optimization [PR107353] to restore assert if not compiling for shared library. When compiling for shared library, the recomputed model may be weaker. Linker may issue an error if the front-end assigned model isn't supported in shared library. But compiler doesn't know if the generated code will be linked into executable or shared library. gcc/ PR other/107353 PR middle-end/121352 * ipa-visibility.cc (function_and_variable_visibility): Don't check tls_model attribute. Restore assert if not compiling for shared library. * doc/extend.texi: Update the tls_model attribute. gcc/testsuite/ PR middle-end/121352 * gcc.dg/tls/vis-attr-hidden-gd.c: Scan for tls-local-dynamic. * gcc.dg/tls/vis-flag-hidden-gd.c: Likewise. * gcc.dg/tls/vis-pragma-hidden-gd.c: Likewise. Signed-off-by: H.J. Lu <hjl.to...@gmail.com> --- gcc/doc/extend.texi | 5 ++++- gcc/ipa-visibility.cc | 19 ++++++++++++------- gcc/testsuite/gcc.dg/tls/vis-attr-hidden-gd.c | 4 ++-- gcc/testsuite/gcc.dg/tls/vis-flag-hidden-gd.c | 4 ++-- .../gcc.dg/tls/vis-pragma-hidden-gd.c | 4 ++-- 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 2922d9e9839..879a759714b 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -7563,7 +7563,10 @@ The @code{tls_model} attribute sets thread-local storage model overriding @option{-ftls-model=} command-line switch on a per-variable basis. The @var{tls_model} argument should be one of @code{global-dynamic}, -@code{local-dynamic}, @code{initial-exec} or @code{local-exec}. +@code{local-dynamic}, @code{initial-exec} or @code{local-exec}. The +@code{tls_model} attribute specifies the weakest @acronym{TLS} access +model. GCC may optimize @acronym{TLS} access to a stronger @acronym{TLS} +access model. Not all targets support this attribute. diff --git a/gcc/ipa-visibility.cc b/gcc/ipa-visibility.cc index 8097a03e240..d2283507a31 100644 --- a/gcc/ipa-visibility.cc +++ b/gcc/ipa-visibility.cc @@ -883,17 +883,22 @@ function_and_variable_visibility (bool whole_program) tree decl = vnode->decl; /* Upgrade TLS access model based on optimized visibility status, - unless it was specified explicitly or no references remain. */ + unless no references remain. */ if (DECL_THREAD_LOCAL_P (decl) - && !lookup_attribute ("tls_model", DECL_ATTRIBUTES (decl)) && vnode->ref_list.referring.length ()) { enum tls_model new_model = decl_default_tls_model (decl); - STATIC_ASSERT (TLS_MODEL_GLOBAL_DYNAMIC < TLS_MODEL_LOCAL_DYNAMIC); - STATIC_ASSERT (TLS_MODEL_INITIAL_EXEC < TLS_MODEL_LOCAL_EXEC); - /* We'd prefer to assert that recomputed model is not weaker than - what the front-end assigned, but cannot: see PR 107353. */ - if (new_model >= decl_tls_model (decl)) + /* Assert that the recomputed model is not weaker than + what the front-end assigned if not comping for shared + library. When compiling for shared library, the + recomputed model may be weaker. Linker may issue an + error if the front-end assigned model isn't supported + in shared library. But compiler doesn't know if the + generated code will be linked into executable or shared + library. */ + tls_model model = decl_tls_model (decl); + gcc_checking_assert (flag_shlib || new_model >= model); + if (new_model > model) set_decl_tls_model (decl, new_model); } } diff --git a/gcc/testsuite/gcc.dg/tls/vis-attr-hidden-gd.c b/gcc/testsuite/gcc.dg/tls/vis-attr-hidden-gd.c index e32565588c8..4512bff04ad 100644 --- a/gcc/testsuite/gcc.dg/tls/vis-attr-hidden-gd.c +++ b/gcc/testsuite/gcc.dg/tls/vis-attr-hidden-gd.c @@ -3,11 +3,11 @@ /* { dg-require-effective-target tls } */ /* { dg-options "-O2 -fPIC -fdump-ipa-whole-program" } */ -// tls_model should be global-dynamic due to explicitly specified attribute __attribute__((visibility("hidden"))) __attribute__((tls_model("global-dynamic"))) __thread int x; void reference() { x++; } -/* { dg-final { scan-ipa-dump "Varpool flags: tls-global-dynamic" "whole-program" } } */ +// tls_model should be local-dynamic due to hidden visibility. +/* { dg-final { scan-ipa-dump "Varpool flags: tls-local-dynamic" "whole-program" } } */ diff --git a/gcc/testsuite/gcc.dg/tls/vis-flag-hidden-gd.c b/gcc/testsuite/gcc.dg/tls/vis-flag-hidden-gd.c index cad41e0c8e6..fba79cfd75a 100644 --- a/gcc/testsuite/gcc.dg/tls/vis-flag-hidden-gd.c +++ b/gcc/testsuite/gcc.dg/tls/vis-flag-hidden-gd.c @@ -4,10 +4,10 @@ /* { dg-options "-O2 -fPIC -fdump-ipa-whole-program -fvisibility=hidden" } */ -// tls_model should be global-dynamic due to explicitly specified attribute __attribute__((tls_model("global-dynamic"))) __thread int x; void reference() { x++; } -/* { dg-final { scan-ipa-dump "Varpool flags: tls-global-dynamic" "whole-program" } } */ +// tls_model should be local-dynamic due to hidden visibility. +/* { dg-final { scan-ipa-dump "Varpool flags: tls-local-dynamic" "whole-program" } } */ diff --git a/gcc/testsuite/gcc.dg/tls/vis-pragma-hidden-gd.c b/gcc/testsuite/gcc.dg/tls/vis-pragma-hidden-gd.c index 3b3598134fe..3649b6f7272 100644 --- a/gcc/testsuite/gcc.dg/tls/vis-pragma-hidden-gd.c +++ b/gcc/testsuite/gcc.dg/tls/vis-pragma-hidden-gd.c @@ -6,7 +6,6 @@ #pragma GCC visibility push(hidden) -// tls_model should be global-dynamic due to explicitly specified attribute __attribute__((tls_model("global-dynamic"))) __thread int x; @@ -14,4 +13,5 @@ __thread int x; void reference() { x++; } -/* { dg-final { scan-ipa-dump "Varpool flags: tls-global-dynamic" "whole-program" } } */ +// tls_model should be local-dynamic due to hidden visibility. +/* { dg-final { scan-ipa-dump "Varpool flags: tls-local-dynamic" "whole-program" } } */ -- 2.51.0