1 //===-- sanitizer_platform.h ------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Common platform macros. 11 //===----------------------------------------------------------------------===// 12 13 #ifndef SANITIZER_PLATFORM_H 14 #define SANITIZER_PLATFORM_H 15 16 #if !defined(__linux__) && !defined(__FreeBSD__) && \ 17 !defined(__APPLE__) && !defined(_WIN32) 18 # error "This operating system is not supported" 19 #endif 20 21 #if defined(__linux__) 22 # define SANITIZER_LINUX 1 23 #else 24 # define SANITIZER_LINUX 0 25 #endif 26 27 #if defined(__FreeBSD__) 28 # define SANITIZER_FREEBSD 1 29 #else 30 # define SANITIZER_FREEBSD 0 31 #endif 32 33 #if defined(__APPLE__) 34 # define SANITIZER_MAC 1 35 # include <TargetConditionals.h> 36 # if TARGET_OS_IPHONE 37 # define SANITIZER_IOS 1 38 # else 39 # define SANITIZER_IOS 0 40 # endif 41 # if TARGET_IPHONE_SIMULATOR 42 # define SANITIZER_IOSSIM 1 43 # else 44 # define SANITIZER_IOSSIM 0 45 # endif 46 #else 47 # define SANITIZER_MAC 0 48 # define SANITIZER_IOS 0 49 # define SANITIZER_IOSSIM 0 50 #endif 51 52 #if defined(_WIN32) 53 # define SANITIZER_WINDOWS 1 54 #else 55 # define SANITIZER_WINDOWS 0 56 #endif 57 58 #if defined(__ANDROID__) 59 # define SANITIZER_ANDROID 1 60 #else 61 # define SANITIZER_ANDROID 0 62 #endif 63 64 #define SANITIZER_POSIX (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_MAC) 65 66 #if __LP64__ || defined(_WIN64) 67 # define SANITIZER_WORDSIZE 64 68 #else 69 # define SANITIZER_WORDSIZE 32 70 #endif 71 72 #if SANITIZER_WORDSIZE == 64 73 # define FIRST_32_SECOND_64(a, b) (b) 74 #else 75 # define FIRST_32_SECOND_64(a, b) (a) 76 #endif 77 78 #if defined(__x86_64__) && !defined(_LP64) 79 # define SANITIZER_X32 1 80 #else 81 # define SANITIZER_X32 0 82 #endif 83 84 // By default we allow to use SizeClassAllocator64 on 64-bit platform. 85 // But in some cases (e.g. AArch64's 39-bit address space) SizeClassAllocator64 86 // does not work well and we need to fallback to SizeClassAllocator32. 87 // For such platforms build this code with -DSANITIZER_CAN_USE_ALLOCATOR64=0 or 88 // change the definition of SANITIZER_CAN_USE_ALLOCATOR64 here. 89 #ifndef SANITIZER_CAN_USE_ALLOCATOR64 90 # if defined(__mips64) || defined(__aarch64__) 91 # define SANITIZER_CAN_USE_ALLOCATOR64 0 92 # else 93 # define SANITIZER_CAN_USE_ALLOCATOR64 (SANITIZER_WORDSIZE == 64) 94 # endif 95 #endif 96 97 // The range of addresses which can be returned my mmap. 98 // FIXME: this value should be different on different platforms. Larger values 99 // will still work but will consume more memory for TwoLevelByteMap. 100 #if defined(__mips__) 101 # define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 40) 102 #else 103 # define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47) 104 #endif 105 106 // The AArch64 linux port uses the canonical syscall set as mandated by 107 // the upstream linux community for all new ports. Other ports may still 108 // use legacy syscalls. 109 #ifndef SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 110 # if defined(__aarch64__) && SANITIZER_LINUX 111 # define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 1 112 # else 113 # define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 0 114 # endif 115 #endif 116 117 // udi16 syscalls can only be used when the following conditions are 118 // met: 119 // * target is one of arm32, x86-32, sparc32, sh or m68k 120 // * libc version is libc5, glibc-2.0, glibc-2.1 or glibc-2.2 to 2.15 121 // built against > linux-2.2 kernel headers 122 // Since we don't want to include libc headers here, we check the 123 // target only. 124 #if defined(__arm__) || SANITIZER_X32 || defined(__sparc__) 125 #define SANITIZER_USES_UID16_SYSCALLS 1 126 #else 127 #define SANITIZER_USES_UID16_SYSCALLS 0 128 #endif 129 130 #if defined(__mips__) 131 # define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 10) 132 #else 133 # define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 12) 134 #endif 135 136 // Assume obsolete RPC headers are available by default 137 #if !defined(HAVE_RPC_XDR_H) && !defined(HAVE_TIRPC_RPC_XDR_H) 138 # define HAVE_RPC_XDR_H (SANITIZER_LINUX && !SANITIZER_ANDROID) 139 # define HAVE_TIRPC_RPC_XDR_H 0 140 #endif 141 142 /// \macro MSC_PREREQ 143 /// \brief Is the compiler MSVC of at least the specified version? 144 /// The common \param version values to check for are: 145 /// * 1800: Microsoft Visual Studio 2013 / 12.0 146 /// * 1900: Microsoft Visual Studio 2015 / 14.0 147 #ifdef _MSC_VER 148 # define MSC_PREREQ(version) (_MSC_VER >= (version)) 149 #else 150 # define MSC_PREREQ(version) 0 151 #endif 152 153 #endif // SANITIZER_PLATFORM_H 154