@@ -176,16 +176,27 @@ static SECP256K1_INLINE void *manual_alloc(void** prealloc_ptr, size_t alloc_siz
176
176
# define SECP256K1_GNUC_EXT
177
177
#endif
178
178
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 */
181
190
# 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 )
183
197
# define SECP256K1_BIG_ENDIAN
184
198
# endif
185
199
#endif
186
- #if defined(_MSC_VER ) && defined(_WIN32 ) && !defined(SECP256K1_LITTLE_ENDIAN )
187
- # define SECP256K1_LITTLE_ENDIAN
188
- #endif
189
200
#if defined(SECP256K1_LITTLE_ENDIAN ) == defined(SECP256K1_BIG_ENDIAN )
190
201
# error Please make sure that either SECP256K1_LITTLE_ENDIAN or SECP256K1_BIG_ENDIAN is set, see src/util.h.
191
202
#endif
0 commit comments