// Copyright 2023 The BoringSSL Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef OPENSSL_HEADER_TARGET_H #define OPENSSL_HEADER_TARGET_H // Preprocessor symbols that define the target platform. // // This file may be included in C, C++, and assembler and must be compatible // with each environment. It is separated out only to share code between // and . Prefer to include those headers // instead. #if defined(__x86_64) || defined(_M_AMD64) || defined(_M_X64) #define OPENSSL_64_BIT #define OPENSSL_X86_64 #elif defined(__x86) || defined(__i386) || defined(__i386__) || defined(_M_IX86) #define OPENSSL_32_BIT #define OPENSSL_X86 #elif defined(__AARCH64EL__) || defined(_M_ARM64) #define OPENSSL_64_BIT #define OPENSSL_AARCH64 #elif defined(__ARMEL__) || defined(_M_ARM) #define OPENSSL_32_BIT #define OPENSSL_ARM // All of following architectures are only supported when `__BYTE_ORDER__` can be used to detect // endianness (in crypto/internal.h). #elif !defined(__BYTE_ORDER__) #error "Cannot determine endianness because __BYTE_ORDER__ is not defined" // Targets are assumed to be little-endian unless __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__. #elif !(defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) && \ !(defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) #error "Unsupported endianness" #elif defined(__LP64__) #define OPENSSL_64_BIT #elif defined(__ILP32__) #define OPENSSL_32_BIT // Versions of GCC before 10.0 didn't define `__ILP32__` for all 32-bit targets. #elif defined(__MIPSEL__) || defined(__MIPSEB__) || defined(__PPC__) || defined(__powerpc__) || defined(__csky__) || defined(__XTENSA__) #define OPENSSL_32_BIT #else #error "Unknown target CPU" #endif #if defined(__APPLE__) #define OPENSSL_APPLE #endif #if defined(_WIN32) #define OPENSSL_WINDOWS #endif #if defined(__has_feature) #if __has_feature(address_sanitizer) #define OPENSSL_ASAN #endif #if __has_feature(thread_sanitizer) #define OPENSSL_TSAN #endif #if __has_feature(memory_sanitizer) #define OPENSSL_MSAN #define OPENSSL_ASM_INCOMPATIBLE #endif #if __has_feature(hwaddress_sanitizer) #define OPENSSL_HWASAN #endif #endif // Disable 32-bit Arm assembly on Apple platforms. The last iOS version that // supported 32-bit Arm was iOS 10. #if defined(OPENSSL_APPLE) && defined(OPENSSL_ARM) #define OPENSSL_ASM_INCOMPATIBLE #endif #if defined(OPENSSL_ASM_INCOMPATIBLE) #undef OPENSSL_ASM_INCOMPATIBLE #if !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif // OPENSSL_ASM_INCOMPATIBLE #if !defined(OPENSSL_X86_64) && !defined(OPENSSL_AARCH64) #define OPENSSL_SMALL #endif #endif // OPENSSL_HEADER_TARGET_H