@@ -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_BIG_ENDIAN__ ) && __BYTE_ORDER__ == __ORDER_BIG_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