Remove the ILP32 __arch_swab cruft.
Just use the clang builtins all the time, as we do for the other
architectures. Specifically this fixes compilation errors caused by the
use of the non-standard `asm` when in a pure C mode like c11 rather than
gnu11.
Bug: https://github.com/android/ndk/issues/2107
Change-Id: I0d6fdd52fd6f9c77d4c5e137d82237c97effd438
diff --git a/libc/kernel/tools/defaults.py b/libc/kernel/tools/defaults.py
index a71318e..2994e5e 100644
--- a/libc/kernel/tools/defaults.py
+++ b/libc/kernel/tools/defaults.py
@@ -25,6 +25,23 @@
# Otherwise, there will be two struct timeval definitions when
# __kernel_old_timeval is renamed to timeval.
"__kernel_old_timeval": "1",
+ # Drop the custom byte swap functions and just use the clang builtins.
+ # https://github.com/android/ndk/issues/2107
+ "__arch_swab16": kCppUndefinedMacro,
+ "__arch_swab16p": kCppUndefinedMacro,
+ "__arch_swab16s": kCppUndefinedMacro,
+ "__arch_swab32": kCppUndefinedMacro,
+ "__arch_swab32p": kCppUndefinedMacro,
+ "__arch_swab32s": kCppUndefinedMacro,
+ "__arch_swab64": kCppUndefinedMacro,
+ "__arch_swab64p": kCppUndefinedMacro,
+ "__arch_swab64s": kCppUndefinedMacro,
+ "__arch_swahb32": kCppUndefinedMacro,
+ "__arch_swahb32p": kCppUndefinedMacro,
+ "__arch_swahb32s": kCppUndefinedMacro,
+ "__arch_swahw32": kCppUndefinedMacro,
+ "__arch_swahw32p": kCppUndefinedMacro,
+ "__arch_swahw32s": kCppUndefinedMacro,
}
# This is the set of known kernel data structures we want to remove from
@@ -133,9 +150,6 @@
# These are required to support the above functions.
"__fswahw32",
"__fswahb32",
- # As are these, for ILP32.
- "__arch_swab32",
- "__arch_swab64",
# This is used by various macros in <linux/ioprio.h>.
"ioprio_value",
diff --git a/libc/kernel/uapi/asm-arm/asm/swab.h b/libc/kernel/uapi/asm-arm/asm/swab.h
index 3fff953..7684c22 100644
--- a/libc/kernel/uapi/asm-arm/asm/swab.h
+++ b/libc/kernel/uapi/asm-arm/asm/swab.h
@@ -11,18 +11,7 @@
#ifndef __STRICT_ANSI__
#define __SWAB_64_THRU_32__
#endif
-static inline __attribute__((__const__)) __u32 __arch_swab32(__u32 x) {
- __u32 t;
#ifndef __thumb__
- if(! __builtin_constant_p(x)) {
- asm("eor\t%0, %1, %1, ror #16" : "=r" (t) : "r" (x));
- } else
#endif
- t = x ^ ((x << 16) | (x >> 16));
- x = (x << 24) | (x >> 8);
- t &= ~0x00FF0000;
- x ^= (t >> 8);
- return x;
-}
#define __arch_swab32 __arch_swab32
#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/swab.h b/libc/kernel/uapi/asm-x86/asm/swab.h
index ce43658..31c850d 100644
--- a/libc/kernel/uapi/asm-x86/asm/swab.h
+++ b/libc/kernel/uapi/asm-x86/asm/swab.h
@@ -8,27 +8,9 @@
#define _ASM_X86_SWAB_H
#include <linux/types.h>
#include <linux/compiler.h>
-static inline __attribute__((__const__)) __u32 __arch_swab32(__u32 val) {
- asm("bswapl %0" : "=r" (val) : "0" (val));
- return val;
-}
#define __arch_swab32 __arch_swab32
-static inline __attribute__((__const__)) __u64 __arch_swab64(__u64 val) {
#ifdef __i386__
- union {
- struct {
- __u32 a;
- __u32 b;
- } s;
- __u64 u;
- } v;
- v.u = val;
- asm("bswapl %0; bswapl %1; xchgl %0,%1" : "=r" (v.s.a), "=r" (v.s.b) : "0" (v.s.a), "1" (v.s.b));
- return v.u;
#else
- asm("bswapq %0" : "=r" (val) : "0" (val));
- return val;
#endif
-}
#define __arch_swab64 __arch_swab64
#endif
diff --git a/libc/kernel/uapi/linux/swab.h b/libc/kernel/uapi/linux/swab.h
index 6225a76..5d240e1 100644
--- a/libc/kernel/uapi/linux/swab.h
+++ b/libc/kernel/uapi/linux/swab.h
@@ -15,29 +15,14 @@
#define ___constant_swab64(x) ((__u64) ((((__u64) (x) & (__u64) 0x00000000000000ffULL) << 56) | (((__u64) (x) & (__u64) 0x000000000000ff00ULL) << 40) | (((__u64) (x) & (__u64) 0x0000000000ff0000ULL) << 24) | (((__u64) (x) & (__u64) 0x00000000ff000000ULL) << 8) | (((__u64) (x) & (__u64) 0x000000ff00000000ULL) >> 8) | (((__u64) (x) & (__u64) 0x0000ff0000000000ULL) >> 24) | (((__u64) (x) & (__u64) 0x00ff000000000000ULL) >> 40) | (((__u64) (x) & (__u64) 0xff00000000000000ULL) >> 56)))
#define ___constant_swahw32(x) ((__u32) ((((__u32) (x) & (__u32) 0x0000ffffUL) << 16) | (((__u32) (x) & (__u32) 0xffff0000UL) >> 16)))
#define ___constant_swahb32(x) ((__u32) ((((__u32) (x) & (__u32) 0x00ff00ffUL) << 8) | (((__u32) (x) & (__u32) 0xff00ff00UL) >> 8)))
-#ifdef __arch_swab16
-#else
-#endif
-#ifdef __arch_swab32
-#else
-#endif
-#ifdef __arch_swab64
-#elif defined(__SWAB_64_THRU_32__)
+#ifdef __SWAB_64_THRU_32__
#else
#endif
static inline __attribute__((__const__)) __u32 __fswahw32(__u32 val) {
-#ifdef __arch_swahw32
- return __arch_swahw32(val);
-#else
return ___constant_swahw32(val);
-#endif
}
static inline __attribute__((__const__)) __u32 __fswahb32(__u32 val) {
-#ifdef __arch_swahb32
- return __arch_swahb32(val);
-#else
return ___constant_swahb32(val);
-#endif
}
#define __swab16(x) (__u16) __builtin_bswap16((__u16) (x))
#define __swab32(x) (__u32) __builtin_bswap32((__u32) (x))
@@ -48,73 +33,33 @@
#define __swahw32(x) (__builtin_constant_p((__u32) (x)) ? ___constant_swahw32(x) : __fswahw32(x))
#define __swahb32(x) (__builtin_constant_p((__u32) (x)) ? ___constant_swahb32(x) : __fswahb32(x))
static __always_inline __u16 __swab16p(const __u16 * p) {
-#ifdef __arch_swab16p
- return __arch_swab16p(p);
-#else
return __swab16(* p);
-#endif
}
static __always_inline __u32 __swab32p(const __u32 * p) {
-#ifdef __arch_swab32p
- return __arch_swab32p(p);
-#else
return __swab32(* p);
-#endif
}
static __always_inline __u64 __swab64p(const __u64 * p) {
-#ifdef __arch_swab64p
- return __arch_swab64p(p);
-#else
return __swab64(* p);
-#endif
}
static inline __u32 __swahw32p(const __u32 * p) {
-#ifdef __arch_swahw32p
- return __arch_swahw32p(p);
-#else
return __swahw32(* p);
-#endif
}
static inline __u32 __swahb32p(const __u32 * p) {
-#ifdef __arch_swahb32p
- return __arch_swahb32p(p);
-#else
return __swahb32(* p);
-#endif
}
static inline void __swab16s(__u16 * p) {
-#ifdef __arch_swab16s
- __arch_swab16s(p);
-#else
* p = __swab16p(p);
-#endif
}
static __always_inline void __swab32s(__u32 * p) {
-#ifdef __arch_swab32s
- __arch_swab32s(p);
-#else
* p = __swab32p(p);
-#endif
}
static __always_inline void __swab64s(__u64 * p) {
-#ifdef __arch_swab64s
- __arch_swab64s(p);
-#else
* p = __swab64p(p);
-#endif
}
static inline void __swahw32s(__u32 * p) {
-#ifdef __arch_swahw32s
- __arch_swahw32s(p);
-#else
* p = __swahw32p(p);
-#endif
}
static inline void __swahb32s(__u32 * p) {
-#ifdef __arch_swahb32s
- __arch_swahb32s(p);
-#else
* p = __swahb32p(p);
-#endif
}
#endif