From: Torbjorn SVENSSON <torbjorn.svensson@st.com>
To: Sebastian Huber <sebastian.huber@embedded-brains.de>,
"newlib@sourceware.org" <newlib@sourceware.org>
Subject: RE: [PATCH 14/14] Add --enable-newlib-reent-thread-local option
Date: Tue, 21 Jun 2022 13:59:29 +0000 [thread overview]
Message-ID: <AM6PR10MB2197C24E0A59090946EBEB7B81B39@AM6PR10MB2197.EURPRD10.PROD.OUTLOOK.COM> (raw)
In-Reply-To: <20220621124931.36450-15-sebastian.huber@embedded-brains.de>
Hello Sebastian,
Just out of curiosity, how will this impact RTOSes like FreeRTOS?
Currently, FreeRTOS updates the impure_ptr to point to an instance of struct _reent that belongs to that particular task when the scheduler is switching task.
See https://www.freertos.org/a00110.html#configUSE_NEWLIB_REENTRANT and https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/tasks.c#L2047 for details.
Kind regards,
Torbjörn
> -----Original Message-----
> From: Newlib <newlib-
> bounces+torbjorn.svensson=st.com@sourceware.org> On Behalf Of
> Sebastian Huber
> Sent: den 21 juni 2022 14:50
> To: newlib@sourceware.org
> Subject: [PATCH 14/14] Add --enable-newlib-reent-thread-local option
>
> From: Matt Joyce <matthew.joyce@embedded-brains.de>
>
> By default, Newlib uses a huge object of type struct _reent to store
> thread-specific data. This object is returned by __getreent() if the
> __DYNAMIC_REENT__ Newlib configuration option is defined.
>
> The reentrancy structure contains for example errno and the standard input,
> output, and error file streams. This means that if an application only uses
> errno it has a dependency on the file stream support even if it does not use
> it. This is an issue for lower end targets and applications which need to
> qualify the software according to safety standards (for example ECSS-E-ST-
> 40C,
> ECSS-Q-ST-80C, IEC 61508, ISO 26262, DO-178, DO-330, DO-333).
>
> If the new _REENT_THREAD_LOCAL configuration option is enabled, then
> struct
> _reent is replaced by dedicated thread-local objects for each struct _reent
> member. The thread-local objects are defined in translation units which use
> the corresponding object.
> ---
> newlib/README | 8 +++
> newlib/configure | 21 ++++++++
> newlib/configure.ac | 15 ++++++
> newlib/libc/errno/errno.c | 6 +++
> newlib/libc/include/sys/config.h | 6 +++
> newlib/libc/include/sys/errno.h | 6 +++
> newlib/libc/include/sys/reent.h | 92 ++++++++++++++++++++++++++++++++
> newlib/libc/locale/locale.c | 4 ++
> newlib/libc/reent/impure.c | 4 ++
> newlib/libc/reent/reent.c | 2 +
> newlib/libc/signal/signal.c | 4 ++
> newlib/libc/stdio/findfp.c | 7 +++
> newlib/libc/stdio/tmpnam.c | 5 ++
> newlib/libc/stdlib/dtoa.c | 5 ++
> newlib/libc/stdlib/ecvtbuf.c | 5 ++
> newlib/libc/stdlib/l64a.c | 4 ++
> newlib/libc/stdlib/lcong48.c | 8 +++
> newlib/libc/stdlib/mblen.c | 4 ++
> newlib/libc/stdlib/mbrlen.c | 4 ++
> newlib/libc/stdlib/mbrtowc.c | 4 ++
> newlib/libc/stdlib/mbsnrtowcs.c | 4 ++
> newlib/libc/stdlib/mbtowc.c | 4 ++
> newlib/libc/stdlib/mprec.c | 5 ++
> newlib/libc/stdlib/rand.c | 4 ++
> newlib/libc/stdlib/wcrtomb.c | 4 ++
> newlib/libc/stdlib/wcsnrtombs.c | 4 ++
> newlib/libc/stdlib/wctomb.c | 4 ++
> newlib/libc/string/strsignal.c | 4 ++
> newlib/libc/string/strtok.c | 4 ++
> newlib/libc/time/asctime.c | 4 ++
> newlib/libc/time/gmtime.c | 4 ++
> newlib/libm/math/w_lgamma.c | 4 ++
> newlib/newlib.hin | 4 ++
> 33 files changed, 267 insertions(+)
>
> diff --git a/newlib/README b/newlib/README
> index dd4686eeb..1b2c16cd4 100644
> --- a/newlib/README
> +++ b/newlib/README
> @@ -304,6 +304,14 @@ One feature can be enabled by specifying `--enable-
> FEATURE=yes' or
> layout.
> Disabled by default.
>
> +`--enable-newlib-reent-thread-local'
> + Enable thread-local storage objects as a replacement for struct _reent
> + members. If enabled, then struct _reent is not defined and dedicated
> + thread-local storage objects are provided for each member of the default
> + struct _reent. For statically linked executables only the objects
> + required by the application are linked in.
> + Disabled by default.
> +
> `--disable-newlib-fvwrite-in-streamio'
> NEWLIB implements the vector buffer mechanism to support stream IO
> buffering required by C standard. This feature is possibly
> diff --git a/newlib/configure b/newlib/configure
> index 82c256694..e493eb293 100755
> --- a/newlib/configure
> +++ b/newlib/configure
> @@ -973,6 +973,7 @@ enable_newlib_atexit_dynamic_alloc
> enable_newlib_global_atexit
> enable_newlib_reent_small
> enable_newlib_reent_binary_compat
> +enable_newlib_reent_thread_local
> enable_newlib_global_stdio_streams
> enable_newlib_fvwrite_in_streamio
> enable_newlib_fseek_optimization
> @@ -1641,6 +1642,7 @@ Optional Features:
> --enable-newlib-global-atexit enable atexit data structure as
> global
> --enable-newlib-reent-small enable small reentrant struct support
> --enable-newlib-reent-binary-compat enable backward binary
> compatibility for struct _reent
> + --enable-newlib-reent-thread-local enable thread-local storage objects as
> a replacment for struct _reent members
> --enable-newlib-global-stdio-streams enable global stdio streams
> --disable-newlib-fvwrite-in-streamio disable iov in streamio
> --disable-newlib-fseek-optimization disable fseek optimization
> @@ -2404,6 +2406,19 @@ else
> newlib_reent_binary_compat=no
> fi
>
> +# Check whether --enable-newlib-reent-thread-local was given.
> +if test "${enable_newlib_reent_thread_local+set}" = set; then :
> + enableval=$enable_newlib_reent_thread_local; if test
> "${newlib_reent_thread_local+set}" != set; then
> + case "${enableval}" in
> + yes) newlib_reent_thread_local=yes ;;
> + no) newlib_reent_thread_local=no ;;
> + *) as_fn_error $? "bad value ${enableval} for newlib-enable-reent-
> thread-local option" "$LINENO" 5 ;;
> + esac
> + fi
> +else
> + newlib_reent_thread_local=no
> +fi
> +
> # Check whether --enable-newlib-global-stdio-streams was given.
> if test "${enable_newlib_global_stdio_streams+set}" = set; then :
> enableval=$enable_newlib_global_stdio_streams; case "${enableval}" in
> @@ -6437,6 +6452,12 @@ $as_echo "#define
> _WANT_REENT_BACKWARD_BINARY_COMPAT 1" >>confdefs.h
>
> fi
>
> +if test "${newlib_reent_thread_local}" = "yes"; then
> +
> +$as_echo "#define _WANT_REENT_THREAD_LOCAL 1" >>confdefs.h
> +
> +fi
> +
> _mb_len_max=1
> if test "${newlib_mb}" = "yes"; then
>
> diff --git a/newlib/configure.ac b/newlib/configure.ac
> index 1951aab0c..bed444db0 100644
> --- a/newlib/configure.ac
> +++ b/newlib/configure.ac
> @@ -173,6 +173,17 @@ AC_ARG_ENABLE(newlib-reent-binary-compat,
> esac
> fi], [newlib_reent_binary_compat=no])dnl
>
> +dnl Support --enable-newlib-reent-thread-local
> +AC_ARG_ENABLE(newlib-reent-thread-local,
> +[ --enable-newlib-reent-thread-local enable thread-local storage objects as
> a replacment for struct _reent members],
> +[if test "${newlib_reent_thread_local+set}" != set; then
> + case "${enableval}" in
> + yes) newlib_reent_thread_local=yes ;;
> + no) newlib_reent_thread_local=no ;;
> + *) AC_MSG_ERROR(bad value ${enableval} for newlib-enable-reent-
> thread-local option) ;;
> + esac
> + fi], [newlib_reent_thread_local=no])dnl
> +
> dnl Support --enable-newlib-global-stdio-streams
> dnl This is no longer optional. It is enabled in all Newlib configurations.
> AC_ARG_ENABLE(newlib-global-stdio-streams,
> @@ -435,6 +446,10 @@ if test "${newlib_reent_binary_compat}" = "yes";
> then
> AC_DEFINE(_WANT_REENT_BACKWARD_BINARY_COMPAT, 1, [Define to
> enable backward binary compatibility for struct _reent.])
> fi
>
> +if test "${newlib_reent_thread_local}" = "yes"; then
> + AC_DEFINE(_WANT_REENT_THREAD_LOCAL, 1, [Define to enable thread-
> local storage objects as a replacment for struct _reent members.])
> +fi
> +
> _mb_len_max=1
> if test "${newlib_mb}" = "yes"; then
> AC_DEFINE(_MB_CAPABLE, 1, [Multibyte supported.])
> diff --git a/newlib/libc/errno/errno.c b/newlib/libc/errno/errno.c
> index 70402924b..384b07f2c 100644
> --- a/newlib/libc/errno/errno.c
> +++ b/newlib/libc/errno/errno.c
> @@ -5,6 +5,10 @@
> #include <errno.h>
> #include <reent.h>
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local int _tls_errno;
> +#else /* !_REENT_THREAD_LOCAL */
> +
> #ifndef _REENT_ONLY
>
> int *
> @@ -14,3 +18,5 @@ __errno ()
> }
>
> #endif
> +
> +#endif /* _REENT_THREAD_LOCAL */
> diff --git a/newlib/libc/include/sys/config.h
> b/newlib/libc/include/sys/config.h
> index 4bce10de3..5dcc77a80 100644
> --- a/newlib/libc/include/sys/config.h
> +++ b/newlib/libc/include/sys/config.h
> @@ -297,6 +297,12 @@
> #endif
> #endif
>
> +#ifdef _WANT_REENT_THREAD_LOCAL
> +#ifndef _REENT_THREAD_LOCAL
> +#define _REENT_THREAD_LOCAL
> +#endif
> +#endif
> +
> /* If _MB_EXTENDED_CHARSETS_ALL is set, we want all of the extended
> charsets. The extended charsets add a few functions and a couple
> of tables of a few K each. */
> diff --git a/newlib/libc/include/sys/errno.h b/newlib/libc/include/sys/errno.h
> index 995f30e05..f1509712e 100644
> --- a/newlib/libc/include/sys/errno.h
> +++ b/newlib/libc/include/sys/errno.h
> @@ -10,11 +10,17 @@ extern "C" {
>
> #include <sys/reent.h>
>
> +#ifdef _REENT_THREAD_LOCAL
> +#define errno (_tls_errno)
> +#else /* _REENT_THREAD_LOCAL */
> +
> #ifndef _REENT_ONLY
> #define errno (*__errno())
> extern int *__errno (void);
> #endif
>
> +#endif /* _REENT_THREAD_LOCAL */
> +
> /* Please don't use these variables directly.
> Use strerror instead. */
> extern __IMPORT const char * const _sys_errlist[];
> diff --git a/newlib/libc/include/sys/reent.h b/newlib/libc/include/sys/reent.h
> index 90f848180..71342bebc 100644
> --- a/newlib/libc/include/sys/reent.h
> +++ b/newlib/libc/include/sys/reent.h
> @@ -301,6 +301,8 @@ struct _rand48 {
> #define _REENT_ASCTIME_SIZE 26
> #define _REENT_SIGNAL_SIZE 24
>
> +#ifndef _REENT_THREAD_LOCAL
> +
> #ifdef _REENT_BACKWARD_BINARY_COMPAT
> #define _REENT_INIT_RESERVED_0 0,
> #define _REENT_INIT_RESERVED_1 0,
> @@ -767,6 +769,96 @@ extern struct _reent _impure_data
> __ATTRIBUTE_IMPURE_DATA__;
>
> #define _GLOBAL_REENT (&_impure_data)
>
> +#else /* _REENT_THREAD_LOCAL */
> +
> +#define _REENT NULL
> +#define _GLOBAL_REENT NULL
> +
> +/*
> + * Since _REENT is defined as NULL, this macro ensures that calls to
> + * CHECK_INIT() do not automatically fail.
> + */
> +#define _REENT_IS_NULL(_ptr) 0
> +
> +#define _REENT_CHECK_RAND48(ptr) /* nothing */
> +#define _REENT_CHECK_MP(ptr) /* nothing */
> +#define _REENT_CHECK_TM(ptr) /* nothing */
> +#define _REENT_CHECK_ASCTIME_BUF(ptr) /* nothing */
> +#define _REENT_CHECK_EMERGENCY(ptr) /* nothing */
> +#define _REENT_CHECK_MISC(ptr) /* nothing */
> +#define _REENT_CHECK_SIGNAL_BUF(ptr) /* nothing */
> +
> +extern _Thread_local char _tls_asctime_buf[_REENT_ASCTIME_SIZE];
> +#define _REENT_ASCTIME_BUF(_ptr) (_tls_asctime_buf)
> +extern _Thread_local char *_tls_cvtbuf;
> +#define _REENT_CVTBUF(_ptr) (_tls_cvtbuf)
> +extern _Thread_local int _tls_cvtlen;
> +#define _REENT_CVTLEN(_ptr) (_tls_cvtlen)
> +extern _Thread_local void (*_tls_cleanup)(struct _reent *);
> +#define _REENT_CLEANUP(_ptr) (_tls_cleanup)
> +extern _Thread_local char _tls_emergency;
> +#define _REENT_EMERGENCY(_ptr) (_tls_emergency)
> +extern _Thread_local int _tls_errno;
> +#define _REENT_ERRNO(_ptr) (_tls_errno)
> +extern _Thread_local int _tls_getdate_err;
> +#define _REENT_GETDATE_ERR_P(_ptr) (&_tls_getdate_err)
> +extern _Thread_local int _tls_inc;
> +#define _REENT_INC(_ptr) (_tls_inc)
> +extern _Thread_local char _tls_l64a_buf[8];
> +#define _REENT_L64A_BUF(_ptr) (_tls_l64a_buf)
> +extern _Thread_local struct __locale_t *_tls_locale;
> +#define _REENT_LOCALE(_ptr) (_tls_locale)
> +extern _Thread_local _mbstate_t _tls_mblen_state;
> +#define _REENT_MBLEN_STATE(_ptr) (_tls_mblen_state)
> +extern _Thread_local _mbstate_t _tls_mbrlen_state;
> +#define _REENT_MBRLEN_STATE(_ptr) (_tls_mbrlen_state)
> +extern _Thread_local _mbstate_t _tls_mbrtowc_state;
> +#define _REENT_MBRTOWC_STATE(_ptr) (_tls_mbrtowc_state)
> +extern _Thread_local _mbstate_t _tls_mbsrtowcs_state;
> +#define _REENT_MBSRTOWCS_STATE(_ptr) (_tls_mbsrtowcs_state)
> +extern _Thread_local _mbstate_t _tls_mbtowc_state;
> +#define _REENT_MBTOWC_STATE(_ptr) (_tls_mbtowc_state)
> +extern _Thread_local struct _Bigint **_tls_mp_freelist;
> +#define _REENT_MP_FREELIST(_ptr) (_tls_mp_freelist)
> +extern _Thread_local struct _Bigint *_tls_mp_p5s;
> +#define _REENT_MP_P5S(_ptr) (_tls_mp_p5s)
> +extern _Thread_local struct _Bigint *_tls_mp_result;
> +#define _REENT_MP_RESULT(_ptr) (_tls_mp_result)
> +extern _Thread_local int _tls_mp_result_k;
> +#define _REENT_MP_RESULT_K(_ptr) (_tls_mp_result_k)
> +extern _Thread_local unsigned short _tls_rand48_add;
> +#define _REENT_RAND48_ADD(_ptr) (_tls_rand48_add)
> +extern _Thread_local unsigned short _tls_rand48_mult[3];
> +#define _REENT_RAND48_MULT(_ptr) (_tls_rand48_mult)
> +extern _Thread_local unsigned short _tls_rand48_seed[3];
> +#define _REENT_RAND48_SEED(_ptr) (_tls_rand48_seed)
> +extern _Thread_local unsigned long long _tls_rand_next;
> +#define _REENT_RAND_NEXT(_ptr) (_tls_rand_next)
> +extern _Thread_local void (**_tls_sig_func)(int);
> +#define _REENT_SIG_FUNC(_ptr) (_tls_sig_func)
> +extern _Thread_local char _tls_signal_buf[_REENT_SIGNAL_SIZE];
> +#define _REENT_SIGNAL_BUF(_ptr) (_tls_signal_buf)
> +extern _Thread_local int _tls_gamma_signgam;
> +#define _REENT_SIGNGAM(_ptr) (_tls_gamma_signgam)
> +extern _Thread_local __FILE *_tls_stdin;
> +#define _REENT_STDIN(_ptr) (_tls_stdin)
> +extern _Thread_local __FILE *_tls_stdout;
> +#define _REENT_STDOUT(_ptr) (_tls_stdout)
> +extern _Thread_local __FILE *_tls_stderr;
> +#define _REENT_STDERR(_ptr) (_tls_stderr)
> +extern _Thread_local char *_tls_strtok_last;
> +#define _REENT_STRTOK_LAST(_ptr) (_tls_strtok_last)
> +extern _Thread_local struct __tm _tls_localtime_buf;
> +#define _REENT_TM(_ptr) (&_tls_localtime_buf)
> +extern _Thread_local _mbstate_t _tls_wctomb_state;
> +#define _REENT_WCTOMB_STATE(_ptr) (_tls_wctomb_state)
> +extern _Thread_local _mbstate_t _tls_wcrtomb_state;
> +#define _REENT_WCRTOMB_STATE(_ptr) (_tls_wcrtomb_state)
> +extern _Thread_local _mbstate_t _tls_wcsrtombs_state;
> +#define _REENT_WCSRTOMBS_STATE(_ptr) (_tls_wcsrtombs_state)
> +
> +#endif /* !_REENT_THREAD_LOCAL */
> +
> /* This value is used in stdlib/misc.c. reent/reent.c has to know it
> as well to make sure the freelist is correctly free'd. Therefore
> we define it here, rather than in stdlib/misc.c, as before. */
> diff --git a/newlib/libc/locale/locale.c b/newlib/libc/locale/locale.c
> index 968642745..e523d2366 100644
> --- a/newlib/libc/locale/locale.c
> +++ b/newlib/libc/locale/locale.c
> @@ -166,6 +166,10 @@ No supporting OS subroutines are required.
> #include "../ctype/ctype_.h"
> #include "../stdlib/local.h"
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local struct __locale_t *_tls_locale;
> +#endif
> +
> #ifdef __CYGWIN__ /* Has to be kept available as exported symbol for
> backward compatibility. Set it in setlocale,
> but
> otherwise ignore it. Applications compiled
> after
> diff --git a/newlib/libc/reent/impure.c b/newlib/libc/reent/impure.c
> index 9290c9cd5..a87b91feb 100644
> --- a/newlib/libc/reent/impure.c
> +++ b/newlib/libc/reent/impure.c
> @@ -1,5 +1,7 @@
> #include <reent.h>
>
> +#ifndef _REENT_THREAD_LOCAL
> +
> /* Redeclare these symbols locally as weak so that the file containing
> their definitions (along with a lot of other stuff) isn't sucked in
> unless they are actually used by other compilation units. This is
> @@ -14,3 +16,5 @@ struct _reent __ATTRIBUTE_IMPURE_DATA__
> _impure_data = _REENT_INIT (_impure_data
> extern struct _reent reent_data __attribute__ ((alias("_impure_data")));
> #endif
> struct _reent *__ATTRIBUTE_IMPURE_PTR__ _impure_ptr = &_impure_data;
> +
> +#endif /* _REENT_THREAD_LOCAL */
> diff --git a/newlib/libc/reent/reent.c b/newlib/libc/reent/reent.c
> index 4e9485c7a..db80ca06e 100644
> --- a/newlib/libc/reent/reent.c
> +++ b/newlib/libc/reent/reent.c
> @@ -30,7 +30,9 @@ int errno;
> void
> _reclaim_reent (struct _reent *ptr)
> {
> +#ifndef _REENT_THREAD_LOCAL
> if (ptr != _impure_ptr)
> +#endif
> {
> /* used by mprec routines. */
> #ifdef _REENT_SMALL
> diff --git a/newlib/libc/signal/signal.c b/newlib/libc/signal/signal.c
> index 3f14b4712..77d78f04a 100644
> --- a/newlib/libc/signal/signal.c
> +++ b/newlib/libc/signal/signal.c
> @@ -88,6 +88,10 @@ int _dummy_simulated_signal;
> #include <reent.h>
> #include <_syslist.h>
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local void (**_tls_sig_func)(int);
> +#endif
> +
> int
> _init_signal_r (struct _reent *ptr)
> {
> diff --git a/newlib/libc/stdio/findfp.c b/newlib/libc/stdio/findfp.c
> index fbdb7f2f2..c43028209 100644
> --- a/newlib/libc/stdio/findfp.c
> +++ b/newlib/libc/stdio/findfp.c
> @@ -32,6 +32,13 @@ __FILE __sf[3];
>
> struct _glue __sglue = {NULL, 3, &__sf[0]};
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local __FILE *_tls_stdin = &__sf[0];
> +_Thread_local __FILE *_tls_stdout = &__sf[1];
> +_Thread_local __FILE *_tls_stderr = &__sf[2];
> +_Thread_local void (*_tls_cleanup)(struct _reent *);
> +#endif
> +
> #ifdef _STDIO_BSD_SEMANTICS
> /* BSD and Glibc systems only flush streams which have been written to
> at exit time. Calling flush rather than close for speed, as on
> diff --git a/newlib/libc/stdio/tmpnam.c b/newlib/libc/stdio/tmpnam.c
> index 2767b4b20..51dfd1cea 100644
> --- a/newlib/libc/stdio/tmpnam.c
> +++ b/newlib/libc/stdio/tmpnam.c
> @@ -82,6 +82,11 @@ The global pointer <<environ>> is also required.
> #include <reent.h>
> #include <errno.h>
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local int _tls_inc;
> +_Thread_local char _tls_emergency;
> +#endif
> +
> /* Try to open the file specified, if it can't be opened then try
> another one. Return nonzero if successful, otherwise zero. */
>
> diff --git a/newlib/libc/stdlib/dtoa.c b/newlib/libc/stdlib/dtoa.c
> index e47a8bc77..198fa663a 100644
> --- a/newlib/libc/stdlib/dtoa.c
> +++ b/newlib/libc/stdlib/dtoa.c
> @@ -32,6 +32,11 @@
> #include <string.h>
> #include "mprec.h"
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local struct _Bigint *_tls_mp_result;
> +_Thread_local int _tls_mp_result_k;
> +#endif
> +
> static int
> quorem (_Bigint * b, _Bigint * S)
> {
> diff --git a/newlib/libc/stdlib/ecvtbuf.c b/newlib/libc/stdlib/ecvtbuf.c
> index 05f315108..514896682 100644
> --- a/newlib/libc/stdlib/ecvtbuf.c
> +++ b/newlib/libc/stdlib/ecvtbuf.c
> @@ -57,6 +57,11 @@ Supporting OS subroutines required: <<close>>,
> <<fstat>>, <<isatty>>,
> #include "mprec.h"
> #include "local.h"
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local char *_tls_cvtbuf;
> +_Thread_local int _tls_cvtlen;
> +#endif
> +
> static void
> print_f (struct _reent *ptr,
> char *buf,
> diff --git a/newlib/libc/stdlib/l64a.c b/newlib/libc/stdlib/l64a.c
> index 45282e32d..6f12b6151 100644
> --- a/newlib/libc/stdlib/l64a.c
> +++ b/newlib/libc/stdlib/l64a.c
> @@ -24,6 +24,10 @@
> #include <stdlib.h>
> #include <reent.h>
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local char _tls_l64a_buf[8];
> +#endif
> +
> static const char R64_ARRAY[] =
> "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx
> yz";
>
> char *
> diff --git a/newlib/libc/stdlib/lcong48.c b/newlib/libc/stdlib/lcong48.c
> index 78e9e5746..d1109f0ac 100644
> --- a/newlib/libc/stdlib/lcong48.c
> +++ b/newlib/libc/stdlib/lcong48.c
> @@ -13,6 +13,14 @@
>
> #include "rand48.h"
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local unsigned short _tls_rand48_seed[3] = {_RAND48_SEED_0,
> _RAND48_SEED_1,
> + _RAND48_SEED_2};
> +_Thread_local unsigned short _tls_rand48_mult[3] = {_RAND48_MULT_0,
> _RAND48_MULT_1,
> + _RAND48_MULT_2};
> +_Thread_local unsigned short _tls_rand48_add = _RAND48_ADD;
> +#endif
> +
> void
> _lcong48_r (struct _reent *r,
> unsigned short p[7])
> diff --git a/newlib/libc/stdlib/mblen.c b/newlib/libc/stdlib/mblen.c
> index 3753d3673..24df61519 100644
> --- a/newlib/libc/stdlib/mblen.c
> +++ b/newlib/libc/stdlib/mblen.c
> @@ -42,6 +42,10 @@ effects vary with the locale.
> #include <wchar.h>
> #include "local.h"
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local _mbstate_t _tls_mblen_state;
> +#endif
> +
> int
> mblen (const char *s,
> size_t n)
> diff --git a/newlib/libc/stdlib/mbrlen.c b/newlib/libc/stdlib/mbrlen.c
> index 57a733fed..39e175e43 100644
> --- a/newlib/libc/stdlib/mbrlen.c
> +++ b/newlib/libc/stdlib/mbrlen.c
> @@ -5,6 +5,10 @@
> #include <stdio.h>
> #include <errno.h>
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local _mbstate_t _tls_mbrlen_state;
> +#endif
> +
> size_t
> mbrlen(const char *__restrict s, size_t n, mbstate_t *__restrict ps)
> {
> diff --git a/newlib/libc/stdlib/mbrtowc.c b/newlib/libc/stdlib/mbrtowc.c
> index 521b7a5f4..e641b8cd6 100644
> --- a/newlib/libc/stdlib/mbrtowc.c
> +++ b/newlib/libc/stdlib/mbrtowc.c
> @@ -7,6 +7,10 @@
> #include <string.h>
> #include "local.h"
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local _mbstate_t _tls_mbrtowc_state;
> +#endif
> +
> size_t
> _mbrtowc_r (struct _reent *ptr,
> wchar_t *pwc,
> diff --git a/newlib/libc/stdlib/mbsnrtowcs.c
> b/newlib/libc/stdlib/mbsnrtowcs.c
> index 8f94b1da5..2effc501c 100644
> --- a/newlib/libc/stdlib/mbsnrtowcs.c
> +++ b/newlib/libc/stdlib/mbsnrtowcs.c
> @@ -70,6 +70,10 @@ PORTABILITY
> #include <stdio.h>
> #include <errno.h>
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local _mbstate_t _tls_mbsrtowcs_state;
> +#endif
> +
> size_t
> _mbsnrtowcs_r (struct _reent *r,
> wchar_t *dst,
> diff --git a/newlib/libc/stdlib/mbtowc.c b/newlib/libc/stdlib/mbtowc.c
> index 2dc413f2d..fbd8df61d 100644
> --- a/newlib/libc/stdlib/mbtowc.c
> +++ b/newlib/libc/stdlib/mbtowc.c
> @@ -49,6 +49,10 @@ effects vary with the locale.
> #include <wchar.h>
> #include "local.h"
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local _mbstate_t _tls_mbtowc_state;
> +#endif
> +
> int
> mbtowc (wchar_t *__restrict pwc,
> const char *__restrict s,
> diff --git a/newlib/libc/stdlib/mprec.c b/newlib/libc/stdlib/mprec.c
> index 930c984ca..1f534b068 100644
> --- a/newlib/libc/stdlib/mprec.c
> +++ b/newlib/libc/stdlib/mprec.c
> @@ -86,6 +86,11 @@
> #include <reent.h>
> #include "mprec.h"
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local struct _Bigint *_tls_mp_p5s;
> +_Thread_local struct _Bigint **_tls_mp_freelist;
> +#endif
> +
> /* This is defined in sys/reent.h as (sizeof (size_t) << 3) now, as in NetBSD.
> The old value of 15 was wrong and made newlib vulnerable against buffer
> overrun attacks (CVE-2009-0689), same as other implementations of gdtoa
> diff --git a/newlib/libc/stdlib/rand.c b/newlib/libc/stdlib/rand.c
> index 209cb32ff..ba9cc80f2 100644
> --- a/newlib/libc/stdlib/rand.c
> +++ b/newlib/libc/stdlib/rand.c
> @@ -58,6 +58,10 @@ on two different systems.
> #include <stdlib.h>
> #include <reent.h>
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local unsigned long long _tls_rand_next = 1;
> +#endif
> +
> void
> srand (unsigned int seed)
> {
> diff --git a/newlib/libc/stdlib/wcrtomb.c b/newlib/libc/stdlib/wcrtomb.c
> index 6d670e23a..1b84720ac 100644
> --- a/newlib/libc/stdlib/wcrtomb.c
> +++ b/newlib/libc/stdlib/wcrtomb.c
> @@ -6,6 +6,10 @@
> #include <errno.h>
> #include "local.h"
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local _mbstate_t _tls_wcrtomb_state;
> +#endif
> +
> size_t
> _wcrtomb_r (struct _reent *ptr,
> char *s,
> diff --git a/newlib/libc/stdlib/wcsnrtombs.c
> b/newlib/libc/stdlib/wcsnrtombs.c
> index dfd974f24..abef7ac36 100644
> --- a/newlib/libc/stdlib/wcsnrtombs.c
> +++ b/newlib/libc/stdlib/wcsnrtombs.c
> @@ -72,6 +72,10 @@ PORTABILITY
> #include "local.h"
> #include "../locale/setlocale.h"
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local _mbstate_t _tls_wcsrtombs_state;
> +#endif
> +
> size_t
> _wcsnrtombs_l (struct _reent *r, char *dst, const wchar_t **src, size_t nwc,
> size_t len, mbstate_t *ps, struct __locale_t *loc)
> diff --git a/newlib/libc/stdlib/wctomb.c b/newlib/libc/stdlib/wctomb.c
> index e908d22c2..f56dccf25 100644
> --- a/newlib/libc/stdlib/wctomb.c
> +++ b/newlib/libc/stdlib/wctomb.c
> @@ -45,6 +45,10 @@ effects vary with the locale.
> #include <errno.h>
> #include "local.h"
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local _mbstate_t _tls_wctomb_state;
> +#endif
> +
> int
> wctomb (char *s,
> wchar_t wchar)
> diff --git a/newlib/libc/string/strsignal.c b/newlib/libc/string/strsignal.c
> index 544857b14..89d39fe3c 100644
> --- a/newlib/libc/string/strsignal.c
> +++ b/newlib/libc/string/strsignal.c
> @@ -52,6 +52,10 @@ QUICKREF
> #include <stdlib.h>
> #include <reent.h>
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local char _tls_signal_buf[_REENT_SIGNAL_SIZE];
> +#endif
> +
> char *
> strsignal (int signal)
> {
> diff --git a/newlib/libc/string/strtok.c b/newlib/libc/string/strtok.c
> index 801f51aca..2a11c9196 100644
> --- a/newlib/libc/string/strtok.c
> +++ b/newlib/libc/string/strtok.c
> @@ -74,6 +74,10 @@ QUICKREF
> #include <_ansi.h>
> #include <reent.h>
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local char *_tls_strtok_last;
> +#endif
> +
> #ifndef _REENT_ONLY
>
> extern char *__strtok_r (char *, const char *, char **, int);
> diff --git a/newlib/libc/time/asctime.c b/newlib/libc/time/asctime.c
> index 9aa26c3dc..a81506181 100644
> --- a/newlib/libc/time/asctime.c
> +++ b/newlib/libc/time/asctime.c
> @@ -45,6 +45,10 @@ ANSI C requires <<asctime>>.
> #include <_ansi.h>
> #include <reent.h>
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local char _tls_asctime_buf[_REENT_ASCTIME_SIZE];
> +#endif
> +
> #ifndef _REENT_ONLY
>
> char *
> diff --git a/newlib/libc/time/gmtime.c b/newlib/libc/time/gmtime.c
> index 08e011129..a78d55433 100644
> --- a/newlib/libc/time/gmtime.c
> +++ b/newlib/libc/time/gmtime.c
> @@ -47,6 +47,10 @@ ANSI C requires <<gmtime>>.
>
> #define _GMT_OFFSET 0
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local struct __tm _tls_localtime_buf;
> +#endif
> +
> #ifndef _REENT_ONLY
>
> struct tm *
> diff --git a/newlib/libm/math/w_lgamma.c b/newlib/libm/math/w_lgamma.c
> index c07804779..c075a4fc1 100644
> --- a/newlib/libm/math/w_lgamma.c
> +++ b/newlib/libm/math/w_lgamma.c
> @@ -22,6 +22,10 @@
> #include <reent.h>
> #include <errno.h>
>
> +#ifdef _REENT_THREAD_LOCAL
> +_Thread_local int _tls_gamma_signgam;
> +#endif
> +
> #ifndef _DOUBLE_IS_32BITS
>
> #ifdef __STDC__
> diff --git a/newlib/newlib.hin b/newlib/newlib.hin
> index 30f59ddba..e87a5eabb 100644
> --- a/newlib/newlib.hin
> +++ b/newlib/newlib.hin
> @@ -406,6 +406,10 @@
> restricted storage. */
> #undef _WANT_REENT_SMALL
>
> +/* Define to enable thread-local storage objects as a replacment for struct
> + _reent members. */
> +#undef _WANT_REENT_THREAD_LOCAL
> +
> /* Register application finalization function using atexit. */
> #undef _WANT_REGISTER_FINI
>
> --
> 2.35.3
next prev parent reply other threads:[~2022-06-21 13:59 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-21 12:49 [PATCH 00/14] " Sebastian Huber
2022-06-21 12:49 ` [PATCH 01/14] Move content in <sys/reent.h> Sebastian Huber
2022-06-21 12:49 ` [PATCH 02/14] Define _REENT_EMERGENCY(ptr) only once Sebastian Huber
2022-06-21 12:49 ` [PATCH 03/14] Add _REENT_ERRNO(ptr) Sebastian Huber
[not found] ` <BN2P110MB15447CD8C6DD815779AA7E4C9AB39@BN2P110MB1544.NAMP110.PROD.OUTLOOK.COM>
2022-06-21 14:41 ` Fw: " C Howland
2022-06-23 10:55 ` Sebastian Huber
2022-07-11 7:41 ` Sebastian Huber
2022-07-12 16:11 ` Corinna Vinschen
2022-07-12 16:38 ` Sebastian Huber
2022-07-12 18:25 ` Corinna Vinschen
2022-07-13 7:17 ` Sebastian Huber
2022-07-13 7:50 ` Corinna Vinschen
2022-07-13 8:19 ` Sebastian Huber
2022-07-13 11:13 ` Corinna Vinschen
2022-06-21 12:49 ` [PATCH 04/14] Add _REENT_STDIN(ptr) Sebastian Huber
2022-06-21 12:49 ` [PATCH 05/14] Add _REENT_STDOUT(ptr) Sebastian Huber
2022-06-21 12:49 ` [PATCH 06/14] Add _REENT_STDERR(ptr) Sebastian Huber
2022-06-21 12:49 ` [PATCH 07/14] Add _REENT_INC(ptr) Sebastian Huber
2022-06-21 12:49 ` [PATCH 08/14] Add _REENT_LOCALE(ptr) Sebastian Huber
2022-06-21 12:49 ` [PATCH 09/14] Add _REENT_CLEANUP(ptr) Sebastian Huber
2022-06-21 12:49 ` [PATCH 10/14] Add _REENT_CVTLEN(ptr) Sebastian Huber
2022-06-21 12:49 ` [PATCH 11/14] Add _REENT_CVTBUF(ptr) Sebastian Huber
2022-06-21 12:49 ` [PATCH 12/14] Add _REENT_SIG_FUNC(ptr) Sebastian Huber
2022-06-21 12:49 ` [PATCH 13/14] Add _REENT_IS_NULL() Sebastian Huber
2022-06-21 12:49 ` [PATCH 14/14] Add --enable-newlib-reent-thread-local option Sebastian Huber
2022-06-21 13:59 ` Torbjorn SVENSSON [this message]
2022-06-21 15:10 ` Sebastian Huber
2022-07-12 11:18 ` [PATCH 00/14] " Sebastian Huber
2022-07-12 14:45 ` Corinna Vinschen
2022-07-12 15:53 ` Sebastian Huber
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=AM6PR10MB2197C24E0A59090946EBEB7B81B39@AM6PR10MB2197.EURPRD10.PROD.OUTLOOK.COM \
--to=torbjorn.svensson@st.com \
--cc=newlib@sourceware.org \
--cc=sebastian.huber@embedded-brains.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).