Fix ICE: in function_and_variable_visibility, at ipa-visibility.c:795 [PR99466]

In get_emutls_init_templ_addr, only thread-local declarations that were
DECL_ONE_ONLY would have a public initializer symbol, ignoring variables
that were declared with __attribute__((weak)).

gcc/ChangeLog:

	PR ipa/99466
	* tree-emutls.c (get_emutls_init_templ_addr): Mark initializer of weak
	TLS declarations as public.

gcc/testsuite/ChangeLog:

	PR ipa/99466
	* gcc.dg/tls/pr99466-1.c: New test.
	* gcc.dg/tls/pr99466-2.c: New test.
This commit is contained in:
Iain Buclaw 2021-03-13 17:05:52 +01:00
parent 433b6b12df
commit 8f5e18db25
3 changed files with 22 additions and 2 deletions

View File

@ -0,0 +1,8 @@
/* { dg-do compile } */
/* { dg-require-weak "" } */
/* { dg-require-effective-target tls_emulated } */
/* { dg-add-options tls } */
__attribute__((weak))
__thread int tlsvar = 3;
/* { dg-final { scan-assembler ".weak_definition ___emutls_t.tlsvar" { target *-*-darwin* } } } */
/* { dg-final { scan-assembler-not ".private_extern ___emutls_t.tlsvar" { target *-*-darwin* } } } */

View File

@ -0,0 +1,10 @@
/* { dg-do compile } */
/* { dg-require-weak "" } */
/* { dg-require-visibility "" } */
/* { dg-require-effective-target tls_emulated } */
/* { dg-add-options tls } */
__attribute__((weak))
__attribute__((visibility ("hidden")))
__thread int tlsvar = 3;
/* { dg-final { scan-assembler ".weak_definition ___emutls_t.tlsvar" { target *-*-darwin* } } } */
/* { dg-final { scan-assembler ".private_extern ___emutls_t.tlsvar" { target *-*-darwin* } } } */

View File

@ -242,16 +242,18 @@ get_emutls_init_templ_addr (tree decl)
DECL_PRESERVE_P (to) = DECL_PRESERVE_P (decl);
DECL_WEAK (to) = DECL_WEAK (decl);
if (DECL_ONE_ONLY (decl))
if (DECL_ONE_ONLY (decl) || DECL_WEAK (decl))
{
TREE_STATIC (to) = TREE_STATIC (decl);
TREE_PUBLIC (to) = TREE_PUBLIC (decl);
DECL_VISIBILITY (to) = DECL_VISIBILITY (decl);
make_decl_one_only (to, DECL_ASSEMBLER_NAME (to));
}
else
TREE_STATIC (to) = 1;
if (DECL_ONE_ONLY (decl))
make_decl_one_only (to, DECL_ASSEMBLER_NAME (to));
DECL_VISIBILITY_SPECIFIED (to) = DECL_VISIBILITY_SPECIFIED (decl);
DECL_INITIAL (to) = DECL_INITIAL (decl);
DECL_INITIAL (decl) = NULL;