On 2026-03-14 13:06, Collin Funk wrote:
Since <byteswap.h> has very few functions (at least on glibc), I think
it might be better to include it in <stdbit.h>, which has many more
functions that you may not want when including <byteswap.h> alone.

On the other hand, stdbit.h has standard namespace restrictions that byteswap.h, which isn't standardized, doesn't. And in the future we may run into platforms that support C2y stdbit.h but lack byteswap.h. So the decision is a bit tricky.

Regardless, it's easy to make stdbit.h more namespace-clean on GNU systems, so I installed the attached. Even with these patches, stdbit.h is still polluted by stdint.h on GNU systems, but I don't see any easy way around that.
From a3b64c5ad664d2de8691132978c30285433d4e24 Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email protected]>
Date: Sat, 14 Mar 2026 14:27:18 -0700
Subject: [PATCH 1/2] stdbit-h: avoid <string.h> namespace pollution

* lib/stdbit.in.h (_GL_STDBIT_MEMCPY): New macro.
All uses of memcpy changed.
---
 ChangeLog       |  4 ++++
 lib/stdbit.in.h | 36 ++++++++++++++++++++++--------------
 2 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ae4a2df749..c716be02b3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2026-03-14  Paul Eggert  <[email protected]>
 
+	stdbit-h: avoid <string.h> namespace pollution
+	* lib/stdbit.in.h (_GL_STDBIT_MEMCPY): New macro.
+	All uses of memcpy changed.
+
 	stdbit-h: __has_builtin (__builtin_assume_aligned)
 	Prefer the usual pattern for checking for builtins:
 	allow __has_builtin for compilers that are not Clang or GCC
diff --git a/lib/stdbit.in.h b/lib/stdbit.in.h
index 57972c2680..f8f79c825c 100644
--- a/lib/stdbit.in.h
+++ b/lib/stdbit.in.h
@@ -50,8 +50,16 @@
 /* Get bswap_16, bswap_32, bswap_64.  */
 # include <byteswap.h>
 
-/* Get memcpy.  */
-# include <string.h>
+/* Get memcpy, but keep namespace clean on GNU.  */
+# ifdef __has_builtin
+#  if __has_builtin (__builtin_memcpy)
+#   define _GL_STDBIT_MEMCPY(dest, src, n) __builtin_memcpy (dest, src, n)
+#  endif
+# endif
+# ifndef _GL_STDBIT_MEMCPY
+#  include <string.h>
+#  define _GL_STDBIT_MEMCPY(dest, src, n) memcpy (dest, src, n)
+# endif
 
 #endif
 
@@ -1363,7 +1371,7 @@ stdc_load8_aligned_beu16 (const unsigned char ptr[2])
   if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY)
     {
       uint_least16_t value;
-      memcpy (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 2), 2);
+      _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 2), 2);
       if (!_GL_STDBIT_BIGENDIAN)
         value = bswap_16 (value);
       return value;
@@ -1378,7 +1386,7 @@ stdc_load8_aligned_beu32 (const unsigned char ptr[4])
   if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY)
     {
       uint_least32_t value;
-      memcpy (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 4), 4);
+      _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 4), 4);
       if (!_GL_STDBIT_BIGENDIAN)
         value = bswap_32 (value);
       return value;
@@ -1393,7 +1401,7 @@ stdc_load8_aligned_beu64 (const unsigned char ptr[8])
   if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY)
     {
       uint_least64_t value;
-      memcpy (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 8), 8);
+      _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 8), 8);
       if (!_GL_STDBIT_BIGENDIAN)
         value = bswap_64 (value);
       return value;
@@ -1414,7 +1422,7 @@ stdc_load8_aligned_leu16 (const unsigned char ptr[2])
   if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY)
     {
       uint_least16_t value;
-      memcpy (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 2), 2);
+      _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 2), 2);
       if (_GL_STDBIT_BIGENDIAN)
         value = bswap_16 (value);
       return value;
@@ -1429,7 +1437,7 @@ stdc_load8_aligned_leu32 (const unsigned char ptr[4])
   if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY)
     {
       uint_least32_t value;
-      memcpy (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 4), 4);
+      _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 4), 4);
       if (_GL_STDBIT_BIGENDIAN)
         value = bswap_32 (value);
       return value;
@@ -1444,7 +1452,7 @@ stdc_load8_aligned_leu64 (const unsigned char ptr[8])
   if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY)
     {
       uint_least64_t value;
-      memcpy (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 8), 8);
+      _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 8), 8);
       if (_GL_STDBIT_BIGENDIAN)
         value = bswap_64 (value);
       return value;
@@ -1643,7 +1651,7 @@ stdc_store8_aligned_beu16 (uint_least16_t value, unsigned char ptr[2])
     {
       if (!_GL_STDBIT_BIGENDIAN)
         value = bswap_16 (value);
-      memcpy (_GL_STDBIT_ASSUME_ALIGNED (ptr, 2), &value, 2);
+      _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 2), &value, 2);
     }
   else
     stdc_store8_beu16 (value, ptr);
@@ -1656,7 +1664,7 @@ stdc_store8_aligned_beu32 (uint_least32_t value, unsigned char ptr[4])
     {
       if (!_GL_STDBIT_BIGENDIAN)
         value = bswap_32 (value);
-      memcpy (_GL_STDBIT_ASSUME_ALIGNED (ptr, 4), &value, 4);
+      _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 4), &value, 4);
     }
   else
     stdc_store8_beu32 (value, ptr);
@@ -1669,7 +1677,7 @@ stdc_store8_aligned_beu64 (uint_least64_t value, unsigned char ptr[8])
     {
       if (!_GL_STDBIT_BIGENDIAN)
         value = bswap_64 (value);
-      memcpy (_GL_STDBIT_ASSUME_ALIGNED (ptr, 8), &value, 8);
+      _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 8), &value, 8);
     }
   else
     stdc_store8_beu64 (value, ptr);
@@ -1688,7 +1696,7 @@ stdc_store8_aligned_leu16 (uint_least16_t value, unsigned char ptr[2])
     {
       if (_GL_STDBIT_BIGENDIAN)
         value = bswap_16 (value);
-      memcpy (_GL_STDBIT_ASSUME_ALIGNED (ptr, 2), &value, 2);
+      _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 2), &value, 2);
     }
   else
     stdc_store8_leu16 (value, ptr);
@@ -1701,7 +1709,7 @@ stdc_store8_aligned_leu32 (uint_least32_t value, unsigned char ptr[4])
     {
       if (_GL_STDBIT_BIGENDIAN)
         value = bswap_32 (value);
-      memcpy (_GL_STDBIT_ASSUME_ALIGNED (ptr, 4), &value, 4);
+      _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 4), &value, 4);
     }
   else
     stdc_store8_leu32 (value, ptr);
@@ -1714,7 +1722,7 @@ stdc_store8_aligned_leu64 (uint_least64_t value, unsigned char ptr[8])
     {
       if (_GL_STDBIT_BIGENDIAN)
         value = bswap_64 (value);
-      memcpy (_GL_STDBIT_ASSUME_ALIGNED (ptr, 8), &value, 8);
+      _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 8), &value, 8);
     }
   else
     stdc_store8_leu64 (value, ptr);
-- 
2.51.0

From 154822a7dee7d5fcfe8ca9041bacdfd6f09f4a67 Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email protected]>
Date: Sat, 14 Mar 2026 15:15:50 -0700
Subject: [PATCH 2/2] stdbit-h: avoid <byteswap.h> namespace pollution

* lib/stdbit.in.h (_GL_STDBIT_HAS_BUILTIN_BSWAP16)
(_GL_STDBIT_HAS_BUILTIN_BSWAP32, _GL_STDBIT_HAS_BUILTIN_BSWAP64)
(_GL_STDBIT_BSWAP16, _GL_STDBIT_BSWAP32, _GL_STDBIT_BSWAP64):
New macros.  All uses of bswap_16, bswap_32, bswap_64 changed.
---
 ChangeLog       |  6 +++++
 lib/stdbit.in.h | 65 ++++++++++++++++++++++++++++++++++++++-----------
 2 files changed, 57 insertions(+), 14 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c716be02b3..916981ff2f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2026-03-14  Paul Eggert  <[email protected]>
 
+	stdbit-h: avoid <byteswap.h> namespace pollution
+	* lib/stdbit.in.h (_GL_STDBIT_HAS_BUILTIN_BSWAP16)
+	(_GL_STDBIT_HAS_BUILTIN_BSWAP32, _GL_STDBIT_HAS_BUILTIN_BSWAP64)
+	(_GL_STDBIT_BSWAP16, _GL_STDBIT_BSWAP32, _GL_STDBIT_BSWAP64):
+	New macros.  All uses of bswap_16, bswap_32, bswap_64 changed.
+
 	stdbit-h: avoid <string.h> namespace pollution
 	* lib/stdbit.in.h (_GL_STDBIT_MEMCPY): New macro.
 	All uses of memcpy changed.
diff --git a/lib/stdbit.in.h b/lib/stdbit.in.h
index f8f79c825c..562796b8e4 100644
--- a/lib/stdbit.in.h
+++ b/lib/stdbit.in.h
@@ -47,8 +47,45 @@
 
 #if @GNULIB_STDC_LOAD8_ALIGNED@ || @GNULIB_STDC_STORE8_ALIGNED@
 
-/* Get bswap_16, bswap_32, bswap_64.  */
-# include <byteswap.h>
+/* Get bswap_16, bswap_32, bswap_64, but keep namespace clean on GNU.  */
+# if defined __GNUC__ && 4 < __GNUC__ + (8 <= __GNUC_MINOR__)
+#  define _GL_STDBIT_HAS_BUILTIN_BSWAP16 1
+# elif defined __has_builtin
+#  if __has_builtin (__builtin_bswap16)
+#   define _GL_STDBIT_HAS_BUILTIN_BSWAP16 1
+#  endif
+# endif
+# if defined __GNUC__ && 4 < __GNUC__ + (3 <= __GNUC_MINOR__)
+#  define _GL_STDBIT_HAS_BUILTIN_BSWAP32 1
+#  define _GL_STDBIT_HAS_BUILTIN_BSWAP64 1
+# elif defined __has_builtin
+#  if __has_builtin (__builtin_bswap32)
+#   define _GL_STDBIT_HAS_BUILTIN_BSWAP32 1
+#  endif
+#  if __has_builtin (__builtin_bswap64)
+#   define _GL_STDBIT_HAS_BUILTIN_BSWAP64 1
+#  endif
+# endif
+# if ! (defined _GL_STDBIT_HAS_BUILTIN_BSWAP16 \
+        && defined _GL_STDBIT_HAS_BUILTIN_BSWAP32 \
+        && defined _GL_STDBIT_HAS_BUILTIN_BSWAP64)
+#  include <byteswap.h>
+# endif
+# ifdef _GL_STDBIT_HAS_BUILTIN_BSWAP16
+#  define _GL_STDBIT_BSWAP16(x) __builtin_bswap16 (x)
+# else
+#  define _GL_STDBIT_BSWAP16(x) bswap_16 (x)
+# endif
+# ifdef _GL_STDBIT_HAS_BUILTIN_BSWAP32
+#  define _GL_STDBIT_BSWAP32(x) __builtin_bswap32 (x)
+# else
+#  define _GL_STDBIT_BSWAP32(x) bswap_32 (x)
+# endif
+# ifdef _GL_STDBIT_HAS_BUILTIN_BSWAP64
+#  define _GL_STDBIT_BSWAP64(x) __builtin_bswap64 (x)
+# else
+#  define _GL_STDBIT_BSWAP64(x) bswap_64 (x)
+# endif
 
 /* Get memcpy, but keep namespace clean on GNU.  */
 # ifdef __has_builtin
@@ -1373,7 +1410,7 @@ stdc_load8_aligned_beu16 (const unsigned char ptr[2])
       uint_least16_t value;
       _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 2), 2);
       if (!_GL_STDBIT_BIGENDIAN)
-        value = bswap_16 (value);
+        value = _GL_STDBIT_BSWAP16 (value);
       return value;
     }
   else
@@ -1388,7 +1425,7 @@ stdc_load8_aligned_beu32 (const unsigned char ptr[4])
       uint_least32_t value;
       _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 4), 4);
       if (!_GL_STDBIT_BIGENDIAN)
-        value = bswap_32 (value);
+        value = _GL_STDBIT_BSWAP32 (value);
       return value;
     }
   else
@@ -1403,7 +1440,7 @@ stdc_load8_aligned_beu64 (const unsigned char ptr[8])
       uint_least64_t value;
       _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 8), 8);
       if (!_GL_STDBIT_BIGENDIAN)
-        value = bswap_64 (value);
+        value = _GL_STDBIT_BSWAP64 (value);
       return value;
     }
   else
@@ -1424,7 +1461,7 @@ stdc_load8_aligned_leu16 (const unsigned char ptr[2])
       uint_least16_t value;
       _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 2), 2);
       if (_GL_STDBIT_BIGENDIAN)
-        value = bswap_16 (value);
+        value = _GL_STDBIT_BSWAP16 (value);
       return value;
     }
   else
@@ -1439,7 +1476,7 @@ stdc_load8_aligned_leu32 (const unsigned char ptr[4])
       uint_least32_t value;
       _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 4), 4);
       if (_GL_STDBIT_BIGENDIAN)
-        value = bswap_32 (value);
+        value = _GL_STDBIT_BSWAP32 (value);
       return value;
     }
   else
@@ -1454,7 +1491,7 @@ stdc_load8_aligned_leu64 (const unsigned char ptr[8])
       uint_least64_t value;
       _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 8), 8);
       if (_GL_STDBIT_BIGENDIAN)
-        value = bswap_64 (value);
+        value = _GL_STDBIT_BSWAP64 (value);
       return value;
     }
   else
@@ -1650,7 +1687,7 @@ stdc_store8_aligned_beu16 (uint_least16_t value, unsigned char ptr[2])
   if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY)
     {
       if (!_GL_STDBIT_BIGENDIAN)
-        value = bswap_16 (value);
+        value = _GL_STDBIT_BSWAP16 (value);
       _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 2), &value, 2);
     }
   else
@@ -1663,7 +1700,7 @@ stdc_store8_aligned_beu32 (uint_least32_t value, unsigned char ptr[4])
   if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY)
     {
       if (!_GL_STDBIT_BIGENDIAN)
-        value = bswap_32 (value);
+        value = _GL_STDBIT_BSWAP32 (value);
       _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 4), &value, 4);
     }
   else
@@ -1676,7 +1713,7 @@ stdc_store8_aligned_beu64 (uint_least64_t value, unsigned char ptr[8])
   if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY)
     {
       if (!_GL_STDBIT_BIGENDIAN)
-        value = bswap_64 (value);
+        value = _GL_STDBIT_BSWAP64 (value);
       _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 8), &value, 8);
     }
   else
@@ -1695,7 +1732,7 @@ stdc_store8_aligned_leu16 (uint_least16_t value, unsigned char ptr[2])
   if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY)
     {
       if (_GL_STDBIT_BIGENDIAN)
-        value = bswap_16 (value);
+        value = _GL_STDBIT_BSWAP16 (value);
       _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 2), &value, 2);
     }
   else
@@ -1708,7 +1745,7 @@ stdc_store8_aligned_leu32 (uint_least32_t value, unsigned char ptr[4])
   if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY)
     {
       if (_GL_STDBIT_BIGENDIAN)
-        value = bswap_32 (value);
+        value = _GL_STDBIT_BSWAP32 (value);
       _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 4), &value, 4);
     }
   else
@@ -1721,7 +1758,7 @@ stdc_store8_aligned_leu64 (uint_least64_t value, unsigned char ptr[8])
   if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY)
     {
       if (_GL_STDBIT_BIGENDIAN)
-        value = bswap_64 (value);
+        value = _GL_STDBIT_BSWAP64 (value);
       _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 8), &value, 8);
     }
   else
-- 
2.51.0

Reply via email to