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:
parent
433b6b12df
commit
8f5e18db25
|
@ -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* } } } */
|
|
@ -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* } } } */
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue