[PATCH] Use TLS initial-exec model for __libc_tsd_* thread variables
Florian Weimer
fweimer@redhat.com
Tue Jul 29 14:03:05 GMT 2025
* Jens Remus:
> Commit 10a66a8e421b ("Remove <libc-tsd.h>") removed the TLS initial-exec
> (IE) model attribute from the __libc_tsd_* thread variable declarations
> and definitions. Commit a894f04d8776 ("Optimize __libc_tsd_* thread
> variable access") restored it on declarations.
>
> Restore the TLS initial-exec model attribute on __libc_tsd_* thread
> variable definitions.
>
> This resolves test tst-locale1 failure on s390 32-bit, when using a
> GNU linker without the fix from GNU binutils commit aefebe82dc89
> ("IBM zSystems: Fix offset relative to static TLS").
>
> Signed-off-by: Jens Remus <jremus@linux.ibm.com>
> ---
>
> Notes:
> Even though compiler option -ftls-model=initial-exec is used, the
> explicit specification of __attribute__ ((tls_model ("initial-exec")))
> on thread variable definitions (not declarations) has an effect on the
> code emitted by GCC for s390 32-bit.
>
> ctype/ctype-info.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/ctype/ctype-info.c b/ctype/ctype-info.c
> index b7d3422726f5..fb5acf9419db 100644
> --- a/ctype/ctype-info.c
> +++ b/ctype/ctype-info.c
> @@ -24,11 +24,11 @@
> __ctype_init before user code runs, but this does not happen for
> threads in secondary namespaces. With the initializers, secondary
> namespaces at least get locale data from the C locale. */
> -__thread const uint16_t * __libc_tsd_CTYPE_B
> +__thread const uint16_t * __libc_tsd_CTYPE_B attribute_tls_model_ie
> = (const uint16_t *) _nl_C_LC_CTYPE_class + 128;
> -__thread const int32_t * __libc_tsd_CTYPE_TOLOWER
> +__thread const int32_t * __libc_tsd_CTYPE_TOLOWER attribute_tls_model_ie
> = (const int32_t *) _nl_C_LC_CTYPE_tolower + 128;
> -__thread const int32_t * __libc_tsd_CTYPE_TOUPPER
> +__thread const int32_t * __libc_tsd_CTYPE_TOUPPER attribute_tls_model_ie
> = (const int32_t *) _nl_C_LC_CTYPE_toupper + 128;
It's weird that the declaration in include/ctype.h is not applied by the
compiler (and neither is the command line option). Isn't this a
compiler bug?
I'm okay with this as a workaround.
Reviewed-by: Florian Weimer <fweimer@redhat.com>
Thanks,
Florian
More information about the Libc-alpha
mailing list