* [PATCH 1/7] Add --enable-newlib-backward-binary-compat
2022-05-13 13:46 [PATCH 0/7] Add --enable-newlib-backward-binary-compat configure option Sebastian Huber
@ 2022-05-13 13:46 ` Sebastian Huber
2022-05-13 13:46 ` [PATCH 2/7] Cygwin: Enable backward binary compatibility Sebastian Huber
` (5 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Sebastian Huber @ 2022-05-13 13:46 UTC (permalink / raw)
To: newlib
Add the --enable-newlib-backward-binary-compat configure option. This option
is disabled by default. If enabled, then for example unused members in struct
_reent are preserved to maintain the structure layout.
---
newlib/README | 5 +++++
newlib/configure | 21 +++++++++++++++++++++
newlib/configure.ac | 15 +++++++++++++++
newlib/libc/include/sys/config.h | 6 ++++++
newlib/newlib.hin | 3 +++
5 files changed, 50 insertions(+)
diff --git a/newlib/README b/newlib/README
index 97890b9d2..54921893f 100644
--- a/newlib/README
+++ b/newlib/README
@@ -362,6 +362,11 @@ One feature can be enabled by specifying `--enable-FEATURE=yes' or
less conversion accuracy.
Enabled by default.
+`--enable-newlib-backward-binary-compat'
+ Enable backward binary compatibility. If enabled, then for example unused
+ members in struct _reent are preserved to maintain the structure layout.
+ Disabled by default.
+
`--enable-multilib'
Build many library versions.
Enabled by default.
diff --git a/newlib/configure b/newlib/configure
index c83511da6..6ea3f5631 100755
--- a/newlib/configure
+++ b/newlib/configure
@@ -983,6 +983,7 @@ enable_newlib_nano_formatted_io
enable_newlib_retargetable_locking
enable_newlib_long_time_t
enable_newlib_use_gdtoa
+enable_newlib_backward_binary_compat
enable_multilib
enable_target_optspace
enable_malloc_debugging
@@ -1650,6 +1651,7 @@ Optional Features:
--enable-newlib-retargetable-locking Allow locking routines to be retargeted at link time
--enable-newlib-long-time_t define time_t to long
--enable-newlib-use-gdtoa Use gdtoa rather than legacy ldtoa
+ --enable-newlib-backward-binary-compat enable backward binary compatibility
--enable-multilib build many library versions (default)
--enable-target-optspace optimize for space
--enable-malloc-debugging indicate malloc debugging requested
@@ -2552,6 +2554,19 @@ else
newlib_use_gdtoa=yes
fi
+# Check whether --enable-newlib-backward-binary-compat was given.
+if test "${enable_newlib_backward_binary_compat+set}" = set; then :
+ enableval=$enable_newlib_backward_binary_compat; if test "${newlib_enable_backward_binary_compat+set}" != set; then
+ case "${enableval}" in
+ yes) newlib_enable_backward_binary_compat=yes ;;
+ no) newlib_enable_backward_binary_compat=no ;;
+ *) as_fn_error $? "bad value ${enableval} for newlib-enable-backward-binary-compat option" "$LINENO" 5 ;;
+ esac
+ fi
+else
+ newlib_enable_backward_binary_compat=no
+fi
+
# Default to --enable-multilib
# Check whether --enable-multilib was given.
if test "${enable_multilib+set}" = set; then :
@@ -6529,6 +6544,12 @@ $as_echo "#define _WANT_USE_GDTOA 1" >>confdefs.h
fi
+if test "${newlib_enable_backward_binary_compat}" = "yes"; then
+
+$as_echo "#define _WANT_NEWLIB_BACKWARD_BINARY_COMPAT 1" >>confdefs.h
+
+fi
+
if test "x${iconv_encodings}" != "x" \
|| test "x${iconv_to_encodings}" != "x" \
diff --git a/newlib/configure.ac b/newlib/configure.ac
index 195d336f2..556580967 100644
--- a/newlib/configure.ac
+++ b/newlib/configure.ac
@@ -288,6 +288,17 @@ AC_ARG_ENABLE(newlib-use-gdtoa,
esac
fi], [newlib_use_gdtoa=yes])dnl
+dnl Support --enable-newlib-backward-binary-compat
+AC_ARG_ENABLE(newlib-backward-binary-compat,
+[ --enable-newlib-backward-binary-compat enable backward binary compatibility],
+[if test "${newlib_enable_backward_binary_compat+set}" != set; then
+ case "${enableval}" in
+ yes) newlib_enable_backward_binary_compat=yes ;;
+ no) newlib_enable_backward_binary_compat=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for newlib-enable-backward-binary-compat option) ;;
+ esac
+ fi], [newlib_enable_backward_binary_compat=no])dnl
+
AM_ENABLE_MULTILIB(, ..)
NEWLIB_CONFIGURE(.)
@@ -499,6 +510,10 @@ if test "${newlib_use_gdtoa}" = "yes"; then
AC_DEFINE(_WANT_USE_GDTOA, 1, [Define if using gdtoa rather than legacy ldtoa.])
fi
+if test "${newlib_enable_backward_binary_compat}" = "yes"; then
+ AC_DEFINE(_WANT_NEWLIB_BACKWARD_BINARY_COMPAT, 1, [Define to enable backward binary compatibility.])
+fi
+
dnl
dnl Parse --enable-newlib-iconv-encodings option argument
dnl
diff --git a/newlib/libc/include/sys/config.h b/newlib/libc/include/sys/config.h
index 61a6f95d8..fbc1e0fe1 100644
--- a/newlib/libc/include/sys/config.h
+++ b/newlib/libc/include/sys/config.h
@@ -299,6 +299,12 @@
#endif
#endif
+#ifdef _WANT_NEWLIB_BACKWARD_BINARY_COMPAT
+#ifndef _NEWLIB_BACKWARD_BINARY_COMPAT
+#define _NEWLIB_BACKWARD_BINARY_COMPAT
+#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/newlib.hin b/newlib/newlib.hin
index b52bc7460..cf3086c32 100644
--- a/newlib/newlib.hin
+++ b/newlib/newlib.hin
@@ -402,6 +402,9 @@
/* Positional argument support in printf functions enabled. */
#undef _WANT_IO_POS_ARGS
+/* Define to enable backward binary compatibility. */
+#undef _WANT_NEWLIB_BACKWARD_BINARY_COMPAT
+
/* Define to move the stdio stream FILE objects out of struct _reent and make
them global. The stdio stream pointers of struct _reent are initialized to
point to the global stdio FILE stream objects. */
--
2.35.3
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 2/7] Cygwin: Enable backward binary compatibility
2022-05-13 13:46 [PATCH 0/7] Add --enable-newlib-backward-binary-compat configure option Sebastian Huber
2022-05-13 13:46 ` [PATCH 1/7] Add --enable-newlib-backward-binary-compat Sebastian Huber
@ 2022-05-13 13:46 ` Sebastian Huber
2022-05-13 20:15 ` Corinna Vinschen
2022-05-13 13:46 ` [PATCH 3/7] Optional struct _reent::__unused_sdidinit Sebastian Huber
` (4 subsequent siblings)
6 siblings, 1 reply; 12+ messages in thread
From: Sebastian Huber @ 2022-05-13 13:46 UTC (permalink / raw)
To: newlib
---
winsup/cygwin/include/cygwin/config.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/winsup/cygwin/include/cygwin/config.h b/winsup/cygwin/include/cygwin/config.h
index 71a216fbd..2d410a2e7 100644
--- a/winsup/cygwin/include/cygwin/config.h
+++ b/winsup/cygwin/include/cygwin/config.h
@@ -80,6 +80,7 @@ extern inline struct _reent *__getreent (void)
#define __TM_GMTOFF tm_gmtoff
#define __TM_ZONE tm_zone
#define _USE_LONG_TIME_T 1
+#define _NEWLIB_BACKWARD_BINARY_COMPAT 1
#if defined(__INSIDE_CYGWIN__) || defined(_LIBC)
#define __EXPORT __declspec(dllexport)
--
2.35.3
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/7] Cygwin: Enable backward binary compatibility
2022-05-13 13:46 ` [PATCH 2/7] Cygwin: Enable backward binary compatibility Sebastian Huber
@ 2022-05-13 20:15 ` Corinna Vinschen
2022-05-16 5:31 ` Sebastian Huber
0 siblings, 1 reply; 12+ messages in thread
From: Corinna Vinschen @ 2022-05-13 20:15 UTC (permalink / raw)
To: newlib
On May 13 15:46, Sebastian Huber wrote:
> ---
> winsup/cygwin/include/cygwin/config.h | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/winsup/cygwin/include/cygwin/config.h b/winsup/cygwin/include/cygwin/config.h
> index 71a216fbd..2d410a2e7 100644
> --- a/winsup/cygwin/include/cygwin/config.h
> +++ b/winsup/cygwin/include/cygwin/config.h
> @@ -80,6 +80,7 @@ extern inline struct _reent *__getreent (void)
> #define __TM_GMTOFF tm_gmtoff
> #define __TM_ZONE tm_zone
> #define _USE_LONG_TIME_T 1
> +#define _NEWLIB_BACKWARD_BINARY_COMPAT 1
Why?
AFAICS we don't expose _REENT to user space. In theory (knocking
on wood here), we shouldn't need _REENT binary compat.
Thanks,
Corinna
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/7] Cygwin: Enable backward binary compatibility
2022-05-13 20:15 ` Corinna Vinschen
@ 2022-05-16 5:31 ` Sebastian Huber
2022-05-16 11:09 ` Corinna Vinschen
0 siblings, 1 reply; 12+ messages in thread
From: Sebastian Huber @ 2022-05-16 5:31 UTC (permalink / raw)
To: newlib
On 13/05/2022 22:15, Corinna Vinschen wrote:
> On May 13 15:46, Sebastian Huber wrote:
>> ---
>> winsup/cygwin/include/cygwin/config.h | 1 +
>> 1 file changed, 1 insertion(+)
>>
>> diff --git a/winsup/cygwin/include/cygwin/config.h b/winsup/cygwin/include/cygwin/config.h
>> index 71a216fbd..2d410a2e7 100644
>> --- a/winsup/cygwin/include/cygwin/config.h
>> +++ b/winsup/cygwin/include/cygwin/config.h
>> @@ -80,6 +80,7 @@ extern inline struct _reent *__getreent (void)
>> #define __TM_GMTOFF tm_gmtoff
>> #define __TM_ZONE tm_zone
>> #define _USE_LONG_TIME_T 1
>> +#define _NEWLIB_BACKWARD_BINARY_COMPAT 1
> Why?
>
> AFAICS we don't expose _REENT to user space. In theory (knocking
> on wood here), we shouldn't need _REENT binary compat.
Ok good, I always thought the unused members in struct _reent were
mainly for Cygwin.
Maybe the option should be named --enable-newlib-reent-binary-compat and
restricted to struct _reent.
--
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax: +49-89-18 94 741 - 08
Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/7] Cygwin: Enable backward binary compatibility
2022-05-16 5:31 ` Sebastian Huber
@ 2022-05-16 11:09 ` Corinna Vinschen
0 siblings, 0 replies; 12+ messages in thread
From: Corinna Vinschen @ 2022-05-16 11:09 UTC (permalink / raw)
To: newlib
On May 16 07:31, Sebastian Huber wrote:
> On 13/05/2022 22:15, Corinna Vinschen wrote:
> > On May 13 15:46, Sebastian Huber wrote:
> > > ---
> > > winsup/cygwin/include/cygwin/config.h | 1 +
> > > 1 file changed, 1 insertion(+)
> > >
> > > diff --git a/winsup/cygwin/include/cygwin/config.h b/winsup/cygwin/include/cygwin/config.h
> > > index 71a216fbd..2d410a2e7 100644
> > > --- a/winsup/cygwin/include/cygwin/config.h
> > > +++ b/winsup/cygwin/include/cygwin/config.h
> > > @@ -80,6 +80,7 @@ extern inline struct _reent *__getreent (void)
> > > #define __TM_GMTOFF tm_gmtoff
> > > #define __TM_ZONE tm_zone
> > > #define _USE_LONG_TIME_T 1
> > > +#define _NEWLIB_BACKWARD_BINARY_COMPAT 1
> > Why?
> >
> > AFAICS we don't expose _REENT to user space. In theory (knocking
> > on wood here), we shouldn't need _REENT binary compat.
>
> Ok good, I always thought the unused members in struct _reent were mainly
> for Cygwin.
Sorry, my bad. I wasn't thinking straight last week, apparently.
While Cygwin doesn't directly expose the functions taking a reent ptr as
parameter, we have to expose some of them indirectly, because they are
used in the stdio macros and inline functions, for instance, __swbuf_r.
So, yeah, Cygwin actually needs _reent backward compat here.
> Maybe the option should be named --enable-newlib-reent-binary-compat and
> restricted to struct _reent.
That would be great. Does the above require a v3 of your patch set?
Thanks,
Corinna
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 3/7] Optional struct _reent::__unused_sdidinit
2022-05-13 13:46 [PATCH 0/7] Add --enable-newlib-backward-binary-compat configure option Sebastian Huber
2022-05-13 13:46 ` [PATCH 1/7] Add --enable-newlib-backward-binary-compat Sebastian Huber
2022-05-13 13:46 ` [PATCH 2/7] Cygwin: Enable backward binary compatibility Sebastian Huber
@ 2022-05-13 13:46 ` Sebastian Huber
2022-05-13 13:46 ` [PATCH 4/7] Optional struct _reent::_unspecified_locale_info Sebastian Huber
` (3 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Sebastian Huber @ 2022-05-13 13:46 UTC (permalink / raw)
To: newlib
Provide struct _reent::__unused_sdidinit only if _NEWLIB_BACKWARD_BINARY_COMPAT
is defined.
---
newlib/libc/include/sys/reent.h | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/newlib/libc/include/sys/reent.h b/newlib/libc/include/sys/reent.h
index fa9ac57da..6a1340b4f 100644
--- a/newlib/libc/include/sys/reent.h
+++ b/newlib/libc/include/sys/reent.h
@@ -342,6 +342,12 @@ struct _rand48 {
#define _REENT_ASCTIME_SIZE 26
#define _REENT_SIGNAL_SIZE 24
+#ifdef _NEWLIB_BACKWARD_BINARY_COMPAT
+#define _REENT_INIT_UNUSED_SDIDINIT 0,
+#else
+#define _REENT_INIT_UNUSED_SDIDINIT /* Nothing to initialize */
+#endif
+
/*
* struct _reent
*
@@ -395,9 +401,11 @@ struct _reent
char *_emergency;
+#ifdef _NEWLIB_BACKWARD_BINARY_COMPAT
/* No longer used, but member retained for binary compatibility.
Now, the __cleanup member is used to check initialization. */
int _unused_sdidinit;
+#endif
int _unspecified_locale_info; /* unused, reserved for locale stuff */
struct __locale_t *_locale;/* per-thread locale */
@@ -440,7 +448,7 @@ struct _reent
&__sf[2], \
0, \
_NULL, \
- 0, \
+ _REENT_INIT_UNUSED_SDIDINIT \
0, \
_NULL, \
_NULL, \
@@ -478,7 +486,7 @@ extern const struct __sFILE_fake __sf_fake_stderr;
(__FILE *)&__sf_fake_stderr, \
0, \
_NULL, \
- 0, \
+ _REENT_INIT_UNUSED_SDIDINIT \
0, \
_NULL, \
_NULL, \
@@ -633,9 +641,11 @@ struct _reent
int _unspecified_locale_info; /* unused, reserved for locale stuff */
struct __locale_t *_locale;/* per-thread locale */
+#ifdef _NEWLIB_BACKWARD_BINARY_COMPAT
/* No longer used, but member retained for binary compatibility.
Now, the __cleanup member is used to check initialization. */
int _unused_sdidinit;
+#endif
void (*__cleanup) (struct _reent *);
@@ -723,7 +733,7 @@ struct _reent
"", \
0, \
_NULL, \
- 0, \
+ _REENT_INIT_UNUSED_SDIDINIT \
_NULL, \
_NULL, \
0, \
--
2.35.3
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/7] Optional struct _reent::_unspecified_locale_info
2022-05-13 13:46 [PATCH 0/7] Add --enable-newlib-backward-binary-compat configure option Sebastian Huber
` (2 preceding siblings ...)
2022-05-13 13:46 ` [PATCH 3/7] Optional struct _reent::__unused_sdidinit Sebastian Huber
@ 2022-05-13 13:46 ` Sebastian Huber
2022-05-13 13:46 ` [PATCH 5/7] Optional struct _reent::_new::_unused Sebastian Huber
` (2 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Sebastian Huber @ 2022-05-13 13:46 UTC (permalink / raw)
To: newlib
Provide struct _reent::_unspecified_locale_info only if
_NEWLIB_BACKWARD_BINARY_COMPAT is defined.
---
newlib/libc/include/sys/reent.h | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/newlib/libc/include/sys/reent.h b/newlib/libc/include/sys/reent.h
index 6a1340b4f..96fa94bd7 100644
--- a/newlib/libc/include/sys/reent.h
+++ b/newlib/libc/include/sys/reent.h
@@ -343,8 +343,10 @@ struct _rand48 {
#define _REENT_SIGNAL_SIZE 24
#ifdef _NEWLIB_BACKWARD_BINARY_COMPAT
+#define _REENT_INIT_UNUSED_LOCALE_INFO 0,
#define _REENT_INIT_UNUSED_SDIDINIT 0,
#else
+#define _REENT_INIT_UNUSED_LOCALE_INFO /* Nothing to initialize */
#define _REENT_INIT_UNUSED_SDIDINIT /* Nothing to initialize */
#endif
@@ -405,9 +407,9 @@ struct _reent
/* No longer used, but member retained for binary compatibility.
Now, the __cleanup member is used to check initialization. */
int _unused_sdidinit;
-#endif
int _unspecified_locale_info; /* unused, reserved for locale stuff */
+#endif
struct __locale_t *_locale;/* per-thread locale */
struct _mprec *_mp;
@@ -449,7 +451,7 @@ struct _reent
0, \
_NULL, \
_REENT_INIT_UNUSED_SDIDINIT \
- 0, \
+ _REENT_INIT_UNUSED_LOCALE_INFO \
_NULL, \
_NULL, \
_NULL, \
@@ -487,7 +489,7 @@ extern const struct __sFILE_fake __sf_fake_stderr;
0, \
_NULL, \
_REENT_INIT_UNUSED_SDIDINIT \
- 0, \
+ _REENT_INIT_UNUSED_LOCALE_INFO \
_NULL, \
_NULL, \
_NULL, \
@@ -638,7 +640,9 @@ struct _reent
char _emergency[_REENT_EMERGENCY_SIZE];
/* TODO */
+#ifdef _NEWLIB_BACKWARD_BINARY_COMPAT
int _unspecified_locale_info; /* unused, reserved for locale stuff */
+#endif
struct __locale_t *_locale;/* per-thread locale */
#ifdef _NEWLIB_BACKWARD_BINARY_COMPAT
@@ -731,7 +735,7 @@ struct _reent
_REENT_STDIO_STREAM(&(var), 2), \
0, \
"", \
- 0, \
+ _REENT_INIT_UNUSED_LOCALE_INFO \
_NULL, \
_REENT_INIT_UNUSED_SDIDINIT \
_NULL, \
--
2.35.3
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 5/7] Optional struct _reent::_new::_unused
2022-05-13 13:46 [PATCH 0/7] Add --enable-newlib-backward-binary-compat configure option Sebastian Huber
` (3 preceding siblings ...)
2022-05-13 13:46 ` [PATCH 4/7] Optional struct _reent::_unspecified_locale_info Sebastian Huber
@ 2022-05-13 13:46 ` Sebastian Huber
2022-05-13 13:46 ` [PATCH 6/7] Optional struct _reent::_new::_reent::_unused_rand Sebastian Huber
2022-05-13 13:47 ` [PATCH 7/7] Use global atexit data for all configurations Sebastian Huber
6 siblings, 0 replies; 12+ messages in thread
From: Sebastian Huber @ 2022-05-13 13:46 UTC (permalink / raw)
To: newlib
Provide struct _reent::_new::_unused only if _NEWLIB_BACKWARD_BINARY_COMPAT is
defined.
---
newlib/libc/include/sys/reent.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/newlib/libc/include/sys/reent.h b/newlib/libc/include/sys/reent.h
index 96fa94bd7..5e154cae8 100644
--- a/newlib/libc/include/sys/reent.h
+++ b/newlib/libc/include/sys/reent.h
@@ -687,6 +687,7 @@ struct _reent
_mbstate_t _wcsrtombs_state;
int _h_errno;
} _reent;
+#ifdef _NEWLIB_BACKWARD_BINARY_COMPAT
/* Two next two fields were once used by malloc. They are no longer
used. They are used to preserve the space used before so as to
allow addition of new reent fields and keep binary compatibility. */
@@ -696,6 +697,7 @@ struct _reent
unsigned char * _nextf[_N_LISTS];
unsigned int _nmalloc[_N_LISTS];
} _unused;
+#endif
} _new;
# ifndef _REENT_GLOBAL_ATEXIT
--
2.35.3
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 6/7] Optional struct _reent::_new::_reent::_unused_rand
2022-05-13 13:46 [PATCH 0/7] Add --enable-newlib-backward-binary-compat configure option Sebastian Huber
` (4 preceding siblings ...)
2022-05-13 13:46 ` [PATCH 5/7] Optional struct _reent::_new::_unused Sebastian Huber
@ 2022-05-13 13:46 ` Sebastian Huber
2022-05-13 13:47 ` [PATCH 7/7] Use global atexit data for all configurations Sebastian Huber
6 siblings, 0 replies; 12+ messages in thread
From: Sebastian Huber @ 2022-05-13 13:46 UTC (permalink / raw)
To: newlib
Provide struct _reent::_new::_reent::_unused_rand only if
_NEWLIB_BACKWARD_BINARY_COMPAT is defined.
---
newlib/libc/include/sys/reent.h | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/newlib/libc/include/sys/reent.h b/newlib/libc/include/sys/reent.h
index 5e154cae8..c21f11de2 100644
--- a/newlib/libc/include/sys/reent.h
+++ b/newlib/libc/include/sys/reent.h
@@ -344,9 +344,11 @@ struct _rand48 {
#ifdef _NEWLIB_BACKWARD_BINARY_COMPAT
#define _REENT_INIT_UNUSED_LOCALE_INFO 0,
+#define _REENT_INIT_UNUSED_RAND 0,
#define _REENT_INIT_UNUSED_SDIDINIT 0,
#else
#define _REENT_INIT_UNUSED_LOCALE_INFO /* Nothing to initialize */
+#define _REENT_INIT_UNUSED_RAND /* Nothing to initialize */
#define _REENT_INIT_UNUSED_SDIDINIT /* Nothing to initialize */
#endif
@@ -667,7 +669,9 @@ struct _reent
{
struct
{
+#ifdef _NEWLIB_BACKWARD_BINARY_COMPAT
unsigned int _unused_rand;
+#endif
char * _strtok_last;
char _asctime_buf[_REENT_ASCTIME_SIZE];
struct __tm _localtime_buf;
@@ -749,7 +753,7 @@ struct _reent
_NULL, \
{ \
{ \
- 0, \
+ _REENT_INIT_UNUSED_RAND \
_NULL, \
"", \
{0, 0, 0, 0, 0, 0, 0, 0, 0}, \
--
2.35.3
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 7/7] Use global atexit data for all configurations
2022-05-13 13:46 [PATCH 0/7] Add --enable-newlib-backward-binary-compat configure option Sebastian Huber
` (5 preceding siblings ...)
2022-05-13 13:46 ` [PATCH 6/7] Optional struct _reent::_new::_reent::_unused_rand Sebastian Huber
@ 2022-05-13 13:47 ` Sebastian Huber
2022-05-13 16:30 ` Sebastian Huber
6 siblings, 1 reply; 12+ messages in thread
From: Sebastian Huber @ 2022-05-13 13:47 UTC (permalink / raw)
To: newlib
For the exit processing only members of _GLOBAL_REENT were used by default. If
the _REENT_GLOBAL_ATEXIT option was enabled, then the data structures were
provided to dedicated global objects. Make this option the default. Remove
the option. Provide the struct _reent _atexit and atexit members only if
backward binary compatibility is requested (_NEWLIB_BACKWARD_BINARY_COMPAT).
---
newlib/README | 6 ------
newlib/configure | 7 -------
newlib/configure.ac | 8 ++------
newlib/libc/include/sys/config.h | 1 -
newlib/libc/include/sys/reent.h | 30 ++++++++++--------------------
newlib/libc/reent/reent.c | 19 -------------------
newlib/libc/stdlib/__atexit.c | 15 +++++----------
newlib/libc/stdlib/__call_atexit.c | 8 +++-----
newlib/newlib.hin | 3 ---
9 files changed, 20 insertions(+), 77 deletions(-)
diff --git a/newlib/README b/newlib/README
index 54921893f..8cf37c5ef 100644
--- a/newlib/README
+++ b/newlib/README
@@ -294,12 +294,6 @@ One feature can be enabled by specifying `--enable-FEATURE=yes' or
Disable dynamic allocation of atexit entries.
Most hosts and targets have it enabled in configure.host.
-`--enable-newlib-global-atexit'
- Enable atexit data structure as global variable. By doing so it is
- move out of _reent structure, and can be garbage collected if atexit
- is not referenced.
- Disabled by default.
-
`--enable-newlib-global-stdio-streams'
Enable to move the stdio stream FILE objects out of struct _reent and make
them global. The stdio stream pointers of struct _reent are initialized
diff --git a/newlib/configure b/newlib/configure
index 6ea3f5631..02e243de7 100755
--- a/newlib/configure
+++ b/newlib/configure
@@ -2373,7 +2373,6 @@ if test "${enable_newlib_global_atexit+set}" = set; then :
enableval=$enable_newlib_global_atexit; if test "${newlib_global_atexit+set}" != set; then
case "${enableval}" in
yes) newlib_global_atexit=yes ;;
- no) newlib_global_atexit=no ;;
*) as_fn_error $? "bad value ${enableval} for newlib-global-atexit option" "$LINENO" 5 ;;
esac
fi
@@ -6478,12 +6477,6 @@ $as_echo "#define _ATEXIT_DYNAMIC_ALLOC 1" >>confdefs.h
fi
-if test "${newlib_global_atexit}" = "yes"; then
-
-$as_echo "#define _REENT_GLOBAL_ATEXIT 1" >>confdefs.h
-
-fi
-
if test "${newlib_fvwrite_in_streamio}" = "yes"; then
$as_echo "#define _FVWRITE_IN_STREAMIO 1" >>confdefs.h
diff --git a/newlib/configure.ac b/newlib/configure.ac
index 556580967..196daeb0a 100644
--- a/newlib/configure.ac
+++ b/newlib/configure.ac
@@ -142,13 +142,13 @@ AC_ARG_ENABLE(newlib-atexit-dynamic-alloc,
dnl Support --enable-newlib-global-atexit
dnl Enable atexit data structure as global variables to save memory usage in
-dnl _reent.
+dnl _reent. This is no longer optional. It is enabled in all Newlib
+dnl configurations.
AC_ARG_ENABLE(newlib-global-atexit,
[ --enable-newlib-global-atexit enable atexit data structure as global],
[if test "${newlib_global_atexit+set}" != set; then
case "${enableval}" in
yes) newlib_global_atexit=yes ;;
- no) newlib_global_atexit=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for newlib-global-atexit option) ;;
esac
fi], [newlib_global_atexit=no])dnl
@@ -466,10 +466,6 @@ if test "${newlib_atexit_dynamic_alloc}" = "yes"; then
AC_DEFINE(_ATEXIT_DYNAMIC_ALLOC, 1, [If atexit() may dynamically allocate space for cleanup functions.])
fi
-if test "${newlib_global_atexit}" = "yes"; then
- AC_DEFINE(_REENT_GLOBAL_ATEXIT, 1, [Define if declare atexit data as global.])
-fi
-
if test "${newlib_fvwrite_in_streamio}" = "yes"; then
AC_DEFINE(_FVWRITE_IN_STREAMIO, 1, [Define if ivo supported in streamio.])
fi
diff --git a/newlib/libc/include/sys/config.h b/newlib/libc/include/sys/config.h
index fbc1e0fe1..7bbba2497 100644
--- a/newlib/libc/include/sys/config.h
+++ b/newlib/libc/include/sys/config.h
@@ -242,7 +242,6 @@
#define __FILENAME_MAX__ 255
#define _READ_WRITE_RETURN_TYPE _ssize_t
#define __DYNAMIC_REENT__
-#define _REENT_GLOBAL_ATEXIT
#define _REENT_GLOBAL_STDIO_STREAMS
#endif
diff --git a/newlib/libc/include/sys/reent.h b/newlib/libc/include/sys/reent.h
index c21f11de2..d1d84ffe5 100644
--- a/newlib/libc/include/sys/reent.h
+++ b/newlib/libc/include/sys/reent.h
@@ -105,13 +105,6 @@ struct _atexit {
# define _ATEXIT_INIT {_NULL, 0, {_NULL}, {{_NULL}, {_NULL}, 0, 0}}
#endif
-#ifdef _REENT_GLOBAL_ATEXIT
-# define _REENT_INIT_ATEXIT
-#else
-# define _REENT_INIT_ATEXIT \
- _NULL, _ATEXIT_INIT,
-#endif
-
/*
* Stdio buffers.
*
@@ -343,10 +336,12 @@ struct _rand48 {
#define _REENT_SIGNAL_SIZE 24
#ifdef _NEWLIB_BACKWARD_BINARY_COMPAT
+#define _REENT_INIT_UNUSED_ATEXIT _NULL, _ATEXIT_INIT,
#define _REENT_INIT_UNUSED_LOCALE_INFO 0,
#define _REENT_INIT_UNUSED_RAND 0,
#define _REENT_INIT_UNUSED_SDIDINIT 0,
#else
+#define _REENT_INIT_UNUSED_ATEXIT /* Nothing to initialize */
#define _REENT_INIT_UNUSED_LOCALE_INFO /* Nothing to initialize */
#define _REENT_INIT_UNUSED_RAND /* Nothing to initialize */
#define _REENT_INIT_UNUSED_SDIDINIT /* Nothing to initialize */
@@ -431,11 +426,11 @@ struct _reent
/* signal info */
void (**(_sig_func))(int);
-# ifndef _REENT_GLOBAL_ATEXIT
+#ifdef _NEWLIB_BACKWARD_BINARY_COMPAT
/* atexit stuff */
struct _atexit *_atexit;
struct _atexit _atexit0;
-# endif
+#endif
struct _glue __sglue; /* root of glue chain */
__FILE *__sf; /* file descriptors */
@@ -464,7 +459,7 @@ struct _reent
_NULL, \
_NULL, \
_NULL, \
- _REENT_INIT_ATEXIT \
+ _REENT_INIT_UNUSED_ATEXIT \
{_NULL, 0, _NULL}, \
_NULL, \
_NULL, \
@@ -502,7 +497,7 @@ extern const struct __sFILE_fake __sf_fake_stderr;
_NULL, \
_NULL, \
_NULL, \
- _REENT_INIT_ATEXIT \
+ _REENT_INIT_UNUSED_ATEXIT \
{_NULL, 0, _NULL}, \
_NULL, \
_NULL, \
@@ -704,11 +699,11 @@ struct _reent
#endif
} _new;
-# ifndef _REENT_GLOBAL_ATEXIT
+#ifdef _NEWLIB_BACKWARD_BINARY_COMPAT
/* atexit stuff */
struct _atexit *_atexit; /* points to head of LIFO stack */
struct _atexit _atexit0; /* one guaranteed table, required by ANSI */
-# endif
+#endif
/* signal info */
void (**_sig_func)(int);
@@ -777,7 +772,7 @@ struct _reent
{0, {0}} \
} \
}, \
- _REENT_INIT_ATEXIT \
+ _REENT_INIT_UNUSED_ATEXIT \
_NULL \
_REENT_INIT_SGLUE(&(var)) \
}
@@ -879,12 +874,7 @@ extern int _fwalk_sglue (struct _reent *, int (*)(struct _reent *, __FILE *),
#define _GLOBAL_REENT (&_impure_data)
-#ifdef _REENT_GLOBAL_ATEXIT
-extern struct _atexit *_global_atexit; /* points to head of LIFO stack */
-# define _GLOBAL_ATEXIT _global_atexit
-#else
-# define _GLOBAL_ATEXIT (_GLOBAL_REENT->_atexit)
-#endif
+extern struct _atexit *__atexit; /* points to head of LIFO stack */
#ifdef __cplusplus
}
diff --git a/newlib/libc/reent/reent.c b/newlib/libc/reent/reent.c
index 70f1c5f45..04942ce4d 100644
--- a/newlib/libc/reent/reent.c
+++ b/newlib/libc/reent/reent.c
@@ -93,25 +93,6 @@ _reclaim_reent (struct _reent *ptr)
_free_r (ptr, ptr->_misc);
#endif
-#ifndef _REENT_GLOBAL_ATEXIT
- /* atexit stuff */
-# ifdef _REENT_SMALL
- if (ptr->_atexit && ptr->_atexit->_on_exit_args_ptr)
- _free_r (ptr, ptr->_atexit->_on_exit_args_ptr);
-# else
- if ((ptr->_atexit) && (ptr->_atexit != &ptr->_atexit0))
- {
- struct _atexit *p, *q;
- for (p = ptr->_atexit; p != &ptr->_atexit0;)
- {
- q = p;
- p = p->_next;
- _free_r (ptr, q);
- }
- }
-# endif
-#endif
-
if (ptr->_cvtbuf)
_free_r (ptr, ptr->_cvtbuf);
/* We should free _sig_func to avoid a memory leak, but how to
diff --git a/newlib/libc/stdlib/__atexit.c b/newlib/libc/stdlib/__atexit.c
index 97ce053bf..3f7bf8c2b 100644
--- a/newlib/libc/stdlib/__atexit.c
+++ b/newlib/libc/stdlib/__atexit.c
@@ -53,12 +53,7 @@ const void * __atexit_dummy = &__call_exitprocs;
extern _LOCK_RECURSIVE_T __atexit_recursive_mutex;
#endif
-#ifdef _REENT_GLOBAL_ATEXIT
-static struct _atexit _global_atexit0 = _ATEXIT_INIT;
-# define _GLOBAL_ATEXIT0 (&_global_atexit0)
-#else
-# define _GLOBAL_ATEXIT0 (&_GLOBAL_REENT->_atexit0)
-#endif
+static struct _atexit atexit0 = _ATEXIT_INIT;
/*
* Register a function to be performed at exit or on shared library unload.
@@ -77,10 +72,10 @@ __register_exitproc (int type,
__lock_acquire_recursive(__atexit_recursive_mutex);
#endif
- p = _GLOBAL_ATEXIT;
+ p = __atexit;
if (p == NULL)
{
- _GLOBAL_ATEXIT = p = _GLOBAL_ATEXIT0;
+ __atexit = p = &atexit0;
#ifdef _REENT_SMALL
extern struct _on_exit_args * const __on_exit_args _ATTRIBUTE ((weak));
if (&__on_exit_args != NULL)
@@ -104,8 +99,8 @@ __register_exitproc (int type,
return -1;
}
p->_ind = 0;
- p->_next = _GLOBAL_ATEXIT;
- _GLOBAL_ATEXIT = p;
+ p->_next = __atexit;
+ __atexit = p;
#ifndef _REENT_SMALL
p->_on_exit_args._fntypes = 0;
p->_on_exit_args._is_cxa = 0;
diff --git a/newlib/libc/stdlib/__call_atexit.c b/newlib/libc/stdlib/__call_atexit.c
index c29a03c8e..710440389 100644
--- a/newlib/libc/stdlib/__call_atexit.c
+++ b/newlib/libc/stdlib/__call_atexit.c
@@ -17,9 +17,7 @@ void free(void *) _ATTRIBUTE((__weak__));
__LOCK_INIT_RECURSIVE(, __atexit_recursive_mutex);
#endif
-#ifdef _REENT_GLOBAL_ATEXIT
-struct _atexit *_global_atexit = _NULL;
-#endif
+struct _atexit *__atexit = _NULL;
#ifdef _WANT_REGISTER_FINI
@@ -83,8 +81,8 @@ __call_exitprocs (int code, void *d)
restart:
- p = _GLOBAL_ATEXIT;
- lastp = &_GLOBAL_ATEXIT;
+ p = __atexit;
+ lastp = &__atexit;
while (p)
{
#ifdef _REENT_SMALL
diff --git a/newlib/newlib.hin b/newlib/newlib.hin
index cf3086c32..f59fc57aa 100644
--- a/newlib/newlib.hin
+++ b/newlib/newlib.hin
@@ -378,9 +378,6 @@
/* Verify _REENT_CHECK macros allocate memory successfully. */
#undef _REENT_CHECK_VERIFY
-/* Define if declare atexit data as global. */
-#undef _REENT_GLOBAL_ATEXIT
-
/* Define if using retargetable functions for default lock routines. */
#undef _RETARGETABLE_LOCKING
--
2.35.3
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 7/7] Use global atexit data for all configurations
2022-05-13 13:47 ` [PATCH 7/7] Use global atexit data for all configurations Sebastian Huber
@ 2022-05-13 16:30 ` Sebastian Huber
0 siblings, 0 replies; 12+ messages in thread
From: Sebastian Huber @ 2022-05-13 16:30 UTC (permalink / raw)
To: newlib
On 13/05/2022 15:47, Sebastian Huber wrote:
> For the exit processing only members of _GLOBAL_REENT were used by default. If
> the _REENT_GLOBAL_ATEXIT option was enabled, then the data structures were
> provided to dedicated global objects. Make this option the default. Remove
> the option. Provide the struct _reent _atexit and atexit members only if
> backward binary compatibility is requested (_NEWLIB_BACKWARD_BINARY_COMPAT).
It seems that some code in libgloss accesses this stuff directly:
libgloss/epiphany/crt0.S: add r2,r2,need_to_find_out;
&_GLOBAL_REENT->atexit0
libgloss/epiphany/crt0.S: str r2, [r2,-1];??or -2?;
_GLOBAL_REENT->atexit
libgloss/epiphany/crt0.S: str r0, [r2,1] ;
_GLOBAL_REENT->atexit0._ind
libgloss/epiphany/crt0.S: str r1, [r2,2] ;
_GLOBAL_REENT->atexit0._fns[0]
libgloss/epiphany/crt0.S: add r0,r2,0x14c ;
&_GLOBAL_REENT->atexit0
libgloss/epiphany/crt0.S: str r0, [r0,-1] ;
_GLOBAL_REENT->atexit
libgloss/epiphany/crt0.S: strd r0, [r2,0x2a] ;
_GLOBAL_REENT->atexit0._ind
libgloss/arc/crt0.S: add r1, r1, 0x14c ;
&_GLOBAL_REENT->atexit0
libgloss/arc/crt0.S: st r1, [r1, -4] ;
_GLOBAL_REENT->atexit
libgloss/arc/crt0.S: st_s r0, [r1, 8] ;
_GLOBAL_REENT->atexit0._fns[0]
libgloss/arc/crt0.S: st_s r0, [r1, 4] ;
_GLOBAL_REENT->atexit0._ind
libgloss/sparc_leon/locore_atexit.c: p = _GLOBAL_REENT->_atexit;
libgloss/sparc_leon/locore_atexit.c: _GLOBAL_REENT->_atexit = p =
&_GLOBAL_REENT->_atexit0;
I will update it if the patch is acceptable in general.
--
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax: +49-89-18 94 741 - 08
Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
^ permalink raw reply [flat|nested] 12+ messages in thread