Skip to content

Commit e69dc56

Browse files
committed
Use additional system macros to figure out endianness
Also permit it being overridden by explicitly passing SECP256K1_{BIG,LITTLE}_ENDIAN
1 parent 979961c commit e69dc56

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

src/util.h

+17-6
Original file line numberDiff line numberDiff line change
@@ -176,16 +176,27 @@ static SECP256K1_INLINE void *manual_alloc(void** prealloc_ptr, size_t alloc_siz
176176
# define SECP256K1_GNUC_EXT
177177
#endif
178178

179-
#if defined(__BYTE_ORDER__)
180-
# if defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && !defined(SECP256K1_LITTLE_ENDIAN)
179+
/* If SECP256K1_{LITTLE,BIG}_ENDIAN is not explicitly provided, infer from various other system macros. */
180+
#if !defined(SECP256K1_LITTLE_ENDIAN) && !defined(SECP256K1_BIG_ENDIAN)
181+
/* Inspired by https://github.com/rofl0r/endianness.h/blob/9853923246b065a3b52d2c43835f3819a62c7199/endianness.h#L52L73 */
182+
# if (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || \
183+
defined(_X86_) || defined(__x86_64__) || defined(__i386__) || \
184+
defined(__i486__) || defined(__i586__) || defined(__i686__) || \
185+
defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) || \
186+
defined(__ARMEL__) || defined(__AARCH64EL__) \
187+
(defined(__LITTLE_ENDIAN__) && __LITTLE_ENDIAN__ == 1) || \
188+
(defined(_LITTLE_ENDIAN) && _LITTLE_ENDIAN == 1) || \
189+
defined(_M_IX86) || defined(_M_AMD64) || defined(_M_ARM) /* MSVC */
181190
# define SECP256K1_LITTLE_ENDIAN
182-
# elif defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ && !defined(SECP256K1_BIG_ENDIAN)
191+
# endif
192+
# if (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || \
193+
defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) || \
194+
defined(__MICROBLAZEEB__) || defined(__ARMEB__) || defined(__AARCH64EB__) \
195+
(defined(__BIG_ENDIAN__) && __BIG_ENDIAN__ == 1) || \
196+
(defined(_BIG_ENDIAN) && _BIG_ENDIAN == 1)
183197
# define SECP256K1_BIG_ENDIAN
184198
# endif
185199
#endif
186-
#if defined(_MSC_VER) && defined(_WIN32) && !defined(SECP256K1_LITTLE_ENDIAN)
187-
# define SECP256K1_LITTLE_ENDIAN
188-
#endif
189200
#if defined(SECP256K1_LITTLE_ENDIAN) == defined(SECP256K1_BIG_ENDIAN)
190201
# error Please make sure that either SECP256K1_LITTLE_ENDIAN or SECP256K1_BIG_ENDIAN is set, see src/util.h.
191202
#endif

0 commit comments

Comments
 (0)