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

Reply via email to