Evgeniy Stepanov | 24e1372 | 2013-03-19 14:33:38 +0000 | [diff] [blame] | 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 | |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 16 | #if !defined(__linux__) && !defined(__FreeBSD__) && \ |
| 17 | !defined(__APPLE__) && !defined(_WIN32) |
Evgeniy Stepanov | 24e1372 | 2013-03-19 14:33:38 +0000 | [diff] [blame] | 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 | |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 27 | #if defined(__FreeBSD__) |
| 28 | # define SANITIZER_FREEBSD 1 |
| 29 | #else |
| 30 | # define SANITIZER_FREEBSD 0 |
| 31 | #endif |
| 32 | |
Evgeniy Stepanov | 24e1372 | 2013-03-19 14:33:38 +0000 | [diff] [blame] | 33 | #if defined(__APPLE__) |
| 34 | # define SANITIZER_MAC 1 |
Alexander Potapenko | b8a141f | 2013-10-31 17:38:18 +0000 | [diff] [blame] | 35 | # include <TargetConditionals.h> |
| 36 | # if TARGET_OS_IPHONE |
| 37 | # define SANITIZER_IOS 1 |
| 38 | # else |
| 39 | # define SANITIZER_IOS 0 |
| 40 | # endif |
Pirama Arumuga Nainar | 799172d | 2016-03-03 15:50:30 -0800 | [diff] [blame^] | 41 | # if TARGET_IPHONE_SIMULATOR |
| 42 | # define SANITIZER_IOSSIM 1 |
| 43 | # else |
| 44 | # define SANITIZER_IOSSIM 0 |
| 45 | # endif |
Evgeniy Stepanov | 24e1372 | 2013-03-19 14:33:38 +0000 | [diff] [blame] | 46 | #else |
| 47 | # define SANITIZER_MAC 0 |
Alexander Potapenko | b8a141f | 2013-10-31 17:38:18 +0000 | [diff] [blame] | 48 | # define SANITIZER_IOS 0 |
Pirama Arumuga Nainar | 799172d | 2016-03-03 15:50:30 -0800 | [diff] [blame^] | 49 | # define SANITIZER_IOSSIM 0 |
Evgeniy Stepanov | 24e1372 | 2013-03-19 14:33:38 +0000 | [diff] [blame] | 50 | #endif |
| 51 | |
| 52 | #if defined(_WIN32) |
| 53 | # define SANITIZER_WINDOWS 1 |
| 54 | #else |
| 55 | # define SANITIZER_WINDOWS 0 |
| 56 | #endif |
| 57 | |
Dan Albert | b625a87 | 2014-10-20 15:35:01 +0000 | [diff] [blame] | 58 | #if defined(__ANDROID__) |
Evgeniy Stepanov | 24e1372 | 2013-03-19 14:33:38 +0000 | [diff] [blame] | 59 | # define SANITIZER_ANDROID 1 |
| 60 | #else |
| 61 | # define SANITIZER_ANDROID 0 |
| 62 | #endif |
| 63 | |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 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 |
Pirama Arumuga Nainar | 799172d | 2016-03-03 15:50:30 -0800 | [diff] [blame^] | 90 | # if defined(__mips64) || defined(__aarch64__) |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 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. |
Pirama Arumuga Nainar | 799172d | 2016-03-03 15:50:30 -0800 | [diff] [blame^] | 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__) |
Stephen Hines | 6d18623 | 2014-11-26 17:56:19 -0800 | [diff] [blame] | 101 | # define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 40) |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 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 |
Evgeniy Stepanov | 24e1372 | 2013-03-19 14:33:38 +0000 | [diff] [blame] | 116 | |
Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 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 | |
Pirama Arumuga Nainar | 799172d | 2016-03-03 15:50:30 -0800 | [diff] [blame^] | 130 | #if defined(__mips__) |
Stephen Hines | 6d18623 | 2014-11-26 17:56:19 -0800 | [diff] [blame] | 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 | |
Pirama Arumuga Nainar | 259f706 | 2015-05-06 11:49:53 -0700 | [diff] [blame] | 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 | |
Pirama Arumuga Nainar | 799172d | 2016-03-03 15:50:30 -0800 | [diff] [blame^] | 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 | |
Evgeniy Stepanov | 24e1372 | 2013-03-19 14:33:38 +0000 | [diff] [blame] | 153 | #endif // SANITIZER_PLATFORM_H |