On Sat, Mar 18, 2023 at 04:09:55PM +0100, Jakub Jelinek via Gcc-patches wrote: > On Sat, Mar 18, 2023 at 01:54:58PM +0100, Jakub Jelinek via Gcc-patches wrote: > > The patch is mostly about DECL_EXTERNAL cases, the others are supposedly > > handled by the var_definition_p code there (or at least I assumed; > > testcases certainly test only DECL_EXTERNAL). > > I guess it could be done in cp_finish_decl, maybe better next to the > > /* A reference will be modified here, as it is initialized. */ > > if (! DECL_EXTERNAL (decl) > > && TREE_READONLY (decl) > > && TYPE_REF_P (type)) > > { > > was_readonly = 1; > > TREE_READONLY (decl) = 0; > > } > > spot, but we'd need to export the decl2.cc helpers for it, > > because not all DECL_THREAD_LOCAL_P vars need to be treated that way. > > if (VAR_P (decl) > > && CP_DECL_THREAD_LOCAL_P (decl) > > && var_needs_tls_wrapper (decl) > > && (!DECL_EXTERNAL (decl) || flag_extern_tls_init)) > > TREE_READONLY (decl) = 0; > > where var_needs_tls_wrapper would need to be exported from decl2.cc. > > Though, var_needs_tls_wrapper -> var_defined_without_dynamic_init > > needs > > DECL_NONTRIVIALLY_INITIALIZED_P/DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P, > > so perhaps that is accurate only closer to the end of cp_finish_decl? > > Here it is in patch form, tested so far on tls.exp:
And successfully bootstrapped/regtested on x86_64-linux and i686-linux over the weekend. > 2023-03-18 Jakub Jelinek <ja...@redhat.com> > > PR c++/109164 > * cp-tree.h (var_needs_tls_wrapper): Declare. > * decl2.cc (var_needs_tls_wrapper): No longer static. > * decl.cc (cp_finish_decl): Clear TREE_READONLY on TLS variables > for which a TLS wrapper will be needed. > > * g++.dg/tls/thread_local13.C: New test. > * g++.dg/tls/thread_local13-aux.cc: New file. > * g++.dg/tls/thread_local14.C: New test. > * g++.dg/tls/thread_local14-aux.cc: New file. Jakub