http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53093
--- Comment #8 from Jan Hubicka <hubicka at ucw dot cz> 2012-05-02 14:34:02 UTC --- > > > > Does the aliases behave sanely with emutls? > > > How do I tell? > > Honestly I hoped you will know. Emutls is not my area. > > I should have mentioned that the other tests covering emutls work, so perhaps > I > could answer the first question with a weak "yes". :) Hi, so I managed to get a testcase that fails: /* { dg-do link } */ /* { dg-require-alias "" } */ /* { dg-require-visibility "" } */ /* { dg-require-effective-target tls_runtime } */ /* Test that encode_section_info handles the change from externally defined to locally defined (via hidden). Extracted from glibc. */ struct __res_state { char x[123]; }; extern __thread struct __res_state bar __attribute__ ((tls_model ("initial-exec"))); __thread struct __res_state foo; extern __thread struct __res_state bar __attribute__ ((alias ("foo"))) __attribute__ ((visibility ("hidden"))); int main() { bar.x[0] = 15; if (foo.x[0]!= 15) abort (); return 0; } I think the bug exists at least in GCC 4.7, but it may be interesting to try older compilers, too. I am testing the following fix on x86_64 with emutls enabled. Basically the bug is as I described: we want emutls variable of alias to be alias of emutls variable of target, not the alias of target. DECL_VALUE_EXPR is used to translate vars to emutls vars. Honza Index: tree-emutls.c =================================================================== --- tree-emutls.c (revision 187011) +++ tree-emutls.c (working copy) @@ -338,7 +338,7 @@ new_emutls_decl (tree decl, tree alias_o else varpool_create_variable_alias (to, varpool_node_for_asm - (DECL_ASSEMBLER_NAME (alias_of))->symbol.decl); + (DECL_ASSEMBLER_NAME (DECL_VALUE_EXPR (alias_of)))->symbol.decl); return to; }