public inbox for newlib@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/7] Add --enable-newlib-backward-binary-compat configure option
@ 2022-05-13 13:46 Sebastian Huber
  2022-05-13 13:46 ` [PATCH 1/7] Add --enable-newlib-backward-binary-compat Sebastian Huber
                   ` (6 more replies)
  0 siblings, 7 replies; 12+ messages in thread
From: Sebastian Huber @ 2022-05-13 13:46 UTC (permalink / raw)
  To: newlib

This patch set adds the --enable-newlib-backward-binary-compat configure option
which may be used to define the new Newlib configuration option
_NEWLIB_BACKWARD_BINARY_COMPAT.  This option can be used to provided binary
backward compatibility, for example by preserving unused members in struct
_reent to keep the structure layout.  Make _REENT_GLOBAL_ATEXIT the default and
remove this option.

Sebastian Huber (7):
  Add --enable-newlib-backward-binary-compat
  Cygwin: Enable backward binary compatibility
  Optional struct _reent::__unused_sdidinit
  Optional struct _reent::_unspecified_locale_info
  Optional struct _reent::_new::_unused
  Optional struct _reent::_new::_reent::_unused_rand
  Use global atexit data for all configurations

 newlib/README                         | 11 +++--
 newlib/configure                      | 28 +++++++++---
 newlib/configure.ac                   | 23 +++++++---
 newlib/libc/include/sys/config.h      |  7 ++-
 newlib/libc/include/sys/reent.h       | 64 ++++++++++++++++-----------
 newlib/libc/reent/reent.c             | 19 --------
 newlib/libc/stdlib/__atexit.c         | 15 +++----
 newlib/libc/stdlib/__call_atexit.c    |  8 ++--
 newlib/newlib.hin                     |  6 +--
 winsup/cygwin/include/cygwin/config.h |  1 +
 10 files changed, 98 insertions(+), 84 deletions(-)

-- 
2.35.3


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [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

* [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

* 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

end of thread, other threads:[~2022-05-16 11:09 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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 20:15   ` Corinna Vinschen
2022-05-16  5:31     ` Sebastian Huber
2022-05-16 11:09       ` Corinna Vinschen
2022-05-13 13:46 ` [PATCH 3/7] Optional struct _reent::__unused_sdidinit Sebastian Huber
2022-05-13 13:46 ` [PATCH 4/7] Optional struct _reent::_unspecified_locale_info Sebastian Huber
2022-05-13 13:46 ` [PATCH 5/7] Optional struct _reent::_new::_unused 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
2022-05-13 16:30   ` Sebastian Huber

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).