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 <[email protected]>
>
> 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