xref: /openbsd-src/gnu/llvm/compiler-rt/lib/sanitizer_common/sanitizer_platform.h (revision 68dd5bb1859285b71cb62a10bf107b8ad54064d9)
13cab2bb3Spatrick //===-- sanitizer_platform.h ------------------------------------*- C++ -*-===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick //
93cab2bb3Spatrick // Common platform macros.
103cab2bb3Spatrick //===----------------------------------------------------------------------===//
113cab2bb3Spatrick 
123cab2bb3Spatrick #ifndef SANITIZER_PLATFORM_H
133cab2bb3Spatrick #define SANITIZER_PLATFORM_H
143cab2bb3Spatrick 
153cab2bb3Spatrick #if !defined(__linux__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && \
16d89ec533Spatrick     !defined(__APPLE__) && !defined(_WIN32) && !defined(__Fuchsia__) &&     \
17*68dd5bb1Srobert     !(defined(__sun__) && defined(__svr4__)) && !defined(__OpenBSD__)
183cab2bb3Spatrick #  error "This operating system is not supported"
193cab2bb3Spatrick #endif
203cab2bb3Spatrick 
21d89ec533Spatrick // Get __GLIBC__ on a glibc platform. Exclude Android: features.h includes C
22d89ec533Spatrick // function declarations into a .S file which doesn't compile.
23d89ec533Spatrick // https://crbug.com/1162741
24d89ec533Spatrick #if __has_include(<features.h>) && !defined(__ANDROID__)
25d89ec533Spatrick #  include <features.h>
26d89ec533Spatrick #endif
27d89ec533Spatrick 
283cab2bb3Spatrick #if defined(__linux__)
293cab2bb3Spatrick #  define SANITIZER_LINUX 1
303cab2bb3Spatrick #else
313cab2bb3Spatrick #  define SANITIZER_LINUX 0
323cab2bb3Spatrick #endif
333cab2bb3Spatrick 
34d89ec533Spatrick #if defined(__GLIBC__)
35d89ec533Spatrick #  define SANITIZER_GLIBC 1
36d89ec533Spatrick #else
37d89ec533Spatrick #  define SANITIZER_GLIBC 0
38d89ec533Spatrick #endif
39d89ec533Spatrick 
403cab2bb3Spatrick #if defined(__FreeBSD__)
413cab2bb3Spatrick #  define SANITIZER_FREEBSD 1
423cab2bb3Spatrick #else
433cab2bb3Spatrick #  define SANITIZER_FREEBSD 0
443cab2bb3Spatrick #endif
453cab2bb3Spatrick 
463cab2bb3Spatrick #if defined(__NetBSD__)
473cab2bb3Spatrick #  define SANITIZER_NETBSD 1
483cab2bb3Spatrick #else
493cab2bb3Spatrick #  define SANITIZER_NETBSD 0
503cab2bb3Spatrick #endif
513cab2bb3Spatrick 
523cab2bb3Spatrick #if defined(__sun__) && defined(__svr4__)
533cab2bb3Spatrick #  define SANITIZER_SOLARIS 1
543cab2bb3Spatrick #else
553cab2bb3Spatrick #  define SANITIZER_SOLARIS 0
563cab2bb3Spatrick #endif
573cab2bb3Spatrick 
58*68dd5bb1Srobert #if defined(__OpenBSD__)
59*68dd5bb1Srobert #  define SANITIZER_OPENBSD 1
60*68dd5bb1Srobert #else
61*68dd5bb1Srobert #  define SANITIZER_OPENBSD 0
62*68dd5bb1Srobert #endif
63*68dd5bb1Srobert 
64*68dd5bb1Srobert // - SANITIZER_APPLE: all Apple code
65*68dd5bb1Srobert //   - TARGET_OS_OSX: macOS
66*68dd5bb1Srobert //   - SANITIZER_IOS: devices (iOS and iOS-like)
67*68dd5bb1Srobert //     - SANITIZER_WATCHOS
68*68dd5bb1Srobert //     - SANITIZER_TVOS
69*68dd5bb1Srobert //   - SANITIZER_IOSSIM: simulators (iOS and iOS-like)
70*68dd5bb1Srobert //   - SANITIZER_DRIVERKIT
713cab2bb3Spatrick #if defined(__APPLE__)
72*68dd5bb1Srobert #  define SANITIZER_APPLE 1
733cab2bb3Spatrick #  include <TargetConditionals.h>
74d89ec533Spatrick #  if TARGET_OS_OSX
75d89ec533Spatrick #    define SANITIZER_OSX 1
76d89ec533Spatrick #  else
77d89ec533Spatrick #    define SANITIZER_OSX 0
78d89ec533Spatrick #  endif
793cab2bb3Spatrick #  if TARGET_OS_IPHONE
803cab2bb3Spatrick #    define SANITIZER_IOS 1
813cab2bb3Spatrick #  else
823cab2bb3Spatrick #    define SANITIZER_IOS 0
833cab2bb3Spatrick #  endif
84*68dd5bb1Srobert #  if TARGET_OS_WATCH
85*68dd5bb1Srobert #    define SANITIZER_WATCHOS 1
86*68dd5bb1Srobert #  else
87*68dd5bb1Srobert #    define SANITIZER_WATCHOS 0
88*68dd5bb1Srobert #  endif
89*68dd5bb1Srobert #  if TARGET_OS_TV
90*68dd5bb1Srobert #    define SANITIZER_TVOS 1
91*68dd5bb1Srobert #  else
92*68dd5bb1Srobert #    define SANITIZER_TVOS 0
93*68dd5bb1Srobert #  endif
943cab2bb3Spatrick #  if TARGET_OS_SIMULATOR
953cab2bb3Spatrick #    define SANITIZER_IOSSIM 1
963cab2bb3Spatrick #  else
973cab2bb3Spatrick #    define SANITIZER_IOSSIM 0
983cab2bb3Spatrick #  endif
99*68dd5bb1Srobert #  if defined(TARGET_OS_DRIVERKIT) && TARGET_OS_DRIVERKIT
100*68dd5bb1Srobert #    define SANITIZER_DRIVERKIT 1
1013cab2bb3Spatrick #  else
102*68dd5bb1Srobert #    define SANITIZER_DRIVERKIT 0
103*68dd5bb1Srobert #  endif
104*68dd5bb1Srobert #else
105*68dd5bb1Srobert #  define SANITIZER_APPLE 0
106d89ec533Spatrick #  define SANITIZER_OSX 0
107*68dd5bb1Srobert #  define SANITIZER_IOS 0
1083cab2bb3Spatrick #  define SANITIZER_WATCHOS 0
1093cab2bb3Spatrick #  define SANITIZER_TVOS 0
110*68dd5bb1Srobert #  define SANITIZER_IOSSIM 0
111*68dd5bb1Srobert #  define SANITIZER_DRIVERKIT 0
1123cab2bb3Spatrick #endif
1133cab2bb3Spatrick 
1143cab2bb3Spatrick #if defined(_WIN32)
1153cab2bb3Spatrick #  define SANITIZER_WINDOWS 1
1163cab2bb3Spatrick #else
1173cab2bb3Spatrick #  define SANITIZER_WINDOWS 0
1183cab2bb3Spatrick #endif
1193cab2bb3Spatrick 
1203cab2bb3Spatrick #if defined(_WIN64)
1213cab2bb3Spatrick #  define SANITIZER_WINDOWS64 1
1223cab2bb3Spatrick #else
1233cab2bb3Spatrick #  define SANITIZER_WINDOWS64 0
1243cab2bb3Spatrick #endif
1253cab2bb3Spatrick 
1263cab2bb3Spatrick #if defined(__ANDROID__)
1273cab2bb3Spatrick #  define SANITIZER_ANDROID 1
1283cab2bb3Spatrick #else
1293cab2bb3Spatrick #  define SANITIZER_ANDROID 0
1303cab2bb3Spatrick #endif
1313cab2bb3Spatrick 
1323cab2bb3Spatrick #if defined(__Fuchsia__)
1333cab2bb3Spatrick #  define SANITIZER_FUCHSIA 1
1343cab2bb3Spatrick #else
1353cab2bb3Spatrick #  define SANITIZER_FUCHSIA 0
1363cab2bb3Spatrick #endif
1373cab2bb3Spatrick 
138*68dd5bb1Srobert // Assume linux that is not glibc or android is musl libc.
139*68dd5bb1Srobert #if SANITIZER_LINUX && !SANITIZER_GLIBC && !SANITIZER_ANDROID
140*68dd5bb1Srobert #  define SANITIZER_MUSL 1
141*68dd5bb1Srobert #else
142*68dd5bb1Srobert #  define SANITIZER_MUSL 0
143*68dd5bb1Srobert #endif
144*68dd5bb1Srobert 
1453cab2bb3Spatrick #define SANITIZER_POSIX                                     \
146*68dd5bb1Srobert   (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_APPLE || \
147*68dd5bb1Srobert    SANITIZER_NETBSD || SANITIZER_SOLARIS || SANITIZER_OPENBSD)
1483cab2bb3Spatrick 
1493cab2bb3Spatrick #if __LP64__ || defined(_WIN64)
1503cab2bb3Spatrick #  define SANITIZER_WORDSIZE 64
1513cab2bb3Spatrick #else
1523cab2bb3Spatrick #  define SANITIZER_WORDSIZE 32
1533cab2bb3Spatrick #endif
1543cab2bb3Spatrick 
1553cab2bb3Spatrick #if SANITIZER_WORDSIZE == 64
1563cab2bb3Spatrick #  define FIRST_32_SECOND_64(a, b) (b)
1573cab2bb3Spatrick #else
1583cab2bb3Spatrick #  define FIRST_32_SECOND_64(a, b) (a)
1593cab2bb3Spatrick #endif
1603cab2bb3Spatrick 
1613cab2bb3Spatrick #if defined(__x86_64__) && !defined(_LP64)
1623cab2bb3Spatrick #  define SANITIZER_X32 1
1633cab2bb3Spatrick #else
1643cab2bb3Spatrick #  define SANITIZER_X32 0
1653cab2bb3Spatrick #endif
1663cab2bb3Spatrick 
167*68dd5bb1Srobert #if defined(__x86_64__) || defined(_M_X64)
168*68dd5bb1Srobert #  define SANITIZER_X64 1
169*68dd5bb1Srobert #else
170*68dd5bb1Srobert #  define SANITIZER_X64 0
171*68dd5bb1Srobert #endif
172*68dd5bb1Srobert 
1731f9cb04fSpatrick #if defined(__i386__) || defined(_M_IX86)
1741f9cb04fSpatrick #  define SANITIZER_I386 1
1751f9cb04fSpatrick #else
1761f9cb04fSpatrick #  define SANITIZER_I386 0
1771f9cb04fSpatrick #endif
1781f9cb04fSpatrick 
1793cab2bb3Spatrick #if defined(__mips__)
1803cab2bb3Spatrick #  define SANITIZER_MIPS 1
181*68dd5bb1Srobert #  if defined(__mips64) && _MIPS_SIM == _ABI64
1823cab2bb3Spatrick #    define SANITIZER_MIPS32 0
1833cab2bb3Spatrick #    define SANITIZER_MIPS64 1
1843cab2bb3Spatrick #  else
1853cab2bb3Spatrick #    define SANITIZER_MIPS32 1
1863cab2bb3Spatrick #    define SANITIZER_MIPS64 0
1873cab2bb3Spatrick #  endif
1883cab2bb3Spatrick #else
1893cab2bb3Spatrick #  define SANITIZER_MIPS 0
1903cab2bb3Spatrick #  define SANITIZER_MIPS32 0
1913cab2bb3Spatrick #  define SANITIZER_MIPS64 0
1923cab2bb3Spatrick #endif
1933cab2bb3Spatrick 
1943cab2bb3Spatrick #if defined(__s390__)
1953cab2bb3Spatrick #  define SANITIZER_S390 1
1963cab2bb3Spatrick #  if defined(__s390x__)
1973cab2bb3Spatrick #    define SANITIZER_S390_31 0
1983cab2bb3Spatrick #    define SANITIZER_S390_64 1
1993cab2bb3Spatrick #  else
2003cab2bb3Spatrick #    define SANITIZER_S390_31 1
2013cab2bb3Spatrick #    define SANITIZER_S390_64 0
2023cab2bb3Spatrick #  endif
2033cab2bb3Spatrick #else
2043cab2bb3Spatrick #  define SANITIZER_S390 0
2053cab2bb3Spatrick #  define SANITIZER_S390_31 0
2063cab2bb3Spatrick #  define SANITIZER_S390_64 0
2073cab2bb3Spatrick #endif
2083cab2bb3Spatrick 
209*68dd5bb1Srobert #if defined(__sparc__)
210*68dd5bb1Srobert #  define SANITIZER_SPARC 1
211*68dd5bb1Srobert #  if defined(__arch64__)
212*68dd5bb1Srobert #    define SANITIZER_SPARC32 0
213*68dd5bb1Srobert #    define SANITIZER_SPARC64 1
214*68dd5bb1Srobert #  else
215*68dd5bb1Srobert #    define SANITIZER_SPARC32 1
216*68dd5bb1Srobert #    define SANITIZER_SPARC64 0
217*68dd5bb1Srobert #  endif
218*68dd5bb1Srobert #else
219*68dd5bb1Srobert #  define SANITIZER_SPARC 0
220*68dd5bb1Srobert #  define SANITIZER_SPARC32 0
221*68dd5bb1Srobert #  define SANITIZER_SPARC64 0
222*68dd5bb1Srobert #endif
223*68dd5bb1Srobert 
2243cab2bb3Spatrick #if defined(__powerpc__)
2253cab2bb3Spatrick #  define SANITIZER_PPC 1
2263cab2bb3Spatrick #  if defined(__powerpc64__)
2273cab2bb3Spatrick #    define SANITIZER_PPC32 0
2283cab2bb3Spatrick #    define SANITIZER_PPC64 1
2293cab2bb3Spatrick // 64-bit PPC has two ABIs (v1 and v2).  The old powerpc64 target is
2303cab2bb3Spatrick // big-endian, and uses v1 ABI (known for its function descriptors),
2313cab2bb3Spatrick // while the new powerpc64le target is little-endian and uses v2.
2323cab2bb3Spatrick // In theory, you could convince gcc to compile for their evil twins
2333cab2bb3Spatrick // (eg. big-endian v2), but you won't find such combinations in the wild
2343cab2bb3Spatrick // (it'd require bootstrapping a whole system, which would be quite painful
2353cab2bb3Spatrick // - there's no target triple for that).  LLVM doesn't support them either.
2363cab2bb3Spatrick #    if _CALL_ELF == 2
2373cab2bb3Spatrick #      define SANITIZER_PPC64V1 0
2383cab2bb3Spatrick #      define SANITIZER_PPC64V2 1
2393cab2bb3Spatrick #    else
2403cab2bb3Spatrick #      define SANITIZER_PPC64V1 1
2413cab2bb3Spatrick #      define SANITIZER_PPC64V2 0
2423cab2bb3Spatrick #    endif
2433cab2bb3Spatrick #  else
2443cab2bb3Spatrick #    define SANITIZER_PPC32 1
2453cab2bb3Spatrick #    define SANITIZER_PPC64 0
2463cab2bb3Spatrick #    define SANITIZER_PPC64V1 0
2473cab2bb3Spatrick #    define SANITIZER_PPC64V2 0
2483cab2bb3Spatrick #  endif
2493cab2bb3Spatrick #else
2503cab2bb3Spatrick #  define SANITIZER_PPC 0
2513cab2bb3Spatrick #  define SANITIZER_PPC32 0
2523cab2bb3Spatrick #  define SANITIZER_PPC64 0
2533cab2bb3Spatrick #  define SANITIZER_PPC64V1 0
2543cab2bb3Spatrick #  define SANITIZER_PPC64V2 0
2553cab2bb3Spatrick #endif
2563cab2bb3Spatrick 
257*68dd5bb1Srobert #if defined(__arm__) || defined(_M_ARM)
2583cab2bb3Spatrick #  define SANITIZER_ARM 1
2593cab2bb3Spatrick #else
2603cab2bb3Spatrick #  define SANITIZER_ARM 0
2613cab2bb3Spatrick #endif
2623cab2bb3Spatrick 
263*68dd5bb1Srobert #if defined(__aarch64__) || defined(_M_ARM64)
264*68dd5bb1Srobert #  define SANITIZER_ARM64 1
265*68dd5bb1Srobert #else
266*68dd5bb1Srobert #  define SANITIZER_ARM64 0
267*68dd5bb1Srobert #endif
268*68dd5bb1Srobert 
2693cab2bb3Spatrick #if SANITIZER_SOLARIS && SANITIZER_WORDSIZE == 32
2703cab2bb3Spatrick #  define SANITIZER_SOLARIS32 1
2713cab2bb3Spatrick #else
2723cab2bb3Spatrick #  define SANITIZER_SOLARIS32 0
2733cab2bb3Spatrick #endif
2743cab2bb3Spatrick 
275d89ec533Spatrick #if defined(__riscv) && (__riscv_xlen == 64)
276d89ec533Spatrick #  define SANITIZER_RISCV64 1
2773cab2bb3Spatrick #else
278d89ec533Spatrick #  define SANITIZER_RISCV64 0
2793cab2bb3Spatrick #endif
2803cab2bb3Spatrick 
281*68dd5bb1Srobert #if defined(__loongarch_lp64)
282*68dd5bb1Srobert #  define SANITIZER_LOONGARCH64 1
283*68dd5bb1Srobert #else
284*68dd5bb1Srobert #  define SANITIZER_LOONGARCH64 0
285*68dd5bb1Srobert #endif
286*68dd5bb1Srobert 
2873cab2bb3Spatrick // By default we allow to use SizeClassAllocator64 on 64-bit platform.
288*68dd5bb1Srobert // But in some cases SizeClassAllocator64 does not work well and we need to
289*68dd5bb1Srobert // fallback to SizeClassAllocator32.
2903cab2bb3Spatrick // For such platforms build this code with -DSANITIZER_CAN_USE_ALLOCATOR64=0 or
2913cab2bb3Spatrick // change the definition of SANITIZER_CAN_USE_ALLOCATOR64 here.
2923cab2bb3Spatrick #ifndef SANITIZER_CAN_USE_ALLOCATOR64
293*68dd5bb1Srobert #  if SANITIZER_RISCV64 || SANITIZER_IOS
294*68dd5bb1Srobert #    define SANITIZER_CAN_USE_ALLOCATOR64 0
295*68dd5bb1Srobert #  elif defined(__mips64) || defined(__hexagon__)
2963cab2bb3Spatrick #    define SANITIZER_CAN_USE_ALLOCATOR64 0
2973cab2bb3Spatrick #  else
2983cab2bb3Spatrick #    define SANITIZER_CAN_USE_ALLOCATOR64 (SANITIZER_WORDSIZE == 64)
2993cab2bb3Spatrick #  endif
3003cab2bb3Spatrick #endif
3013cab2bb3Spatrick 
3023cab2bb3Spatrick // The range of addresses which can be returned my mmap.
3033cab2bb3Spatrick // FIXME: this value should be different on different platforms.  Larger values
3043cab2bb3Spatrick // will still work but will consume more memory for TwoLevelByteMap.
3053cab2bb3Spatrick #if defined(__mips__)
306d89ec533Spatrick #  if SANITIZER_GO && defined(__mips64)
307d89ec533Spatrick #    define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47)
308d89ec533Spatrick #  else
3093cab2bb3Spatrick #    define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 40)
310d89ec533Spatrick #  endif
311d89ec533Spatrick #elif SANITIZER_RISCV64
312d89ec533Spatrick #  define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 38)
3133cab2bb3Spatrick #elif defined(__aarch64__)
314*68dd5bb1Srobert #  if SANITIZER_APPLE
315d89ec533Spatrick #    if SANITIZER_OSX || SANITIZER_IOSSIM
316*68dd5bb1Srobert #      define SANITIZER_MMAP_RANGE_SIZE \
317*68dd5bb1Srobert         FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47)
318d89ec533Spatrick #    else
3193cab2bb3Spatrick // Darwin iOS/ARM64 has a 36-bit VMA, 64GiB VM
320*68dd5bb1Srobert #      define SANITIZER_MMAP_RANGE_SIZE \
321*68dd5bb1Srobert         FIRST_32_SECOND_64(1ULL << 32, 1ULL << 36)
322d89ec533Spatrick #    endif
3233cab2bb3Spatrick #  else
3243cab2bb3Spatrick #    define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 48)
3253cab2bb3Spatrick #  endif
3263cab2bb3Spatrick #elif defined(__sparc__)
3273cab2bb3Spatrick #  define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 52)
3283cab2bb3Spatrick #else
3293cab2bb3Spatrick #  define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47)
3303cab2bb3Spatrick #endif
3313cab2bb3Spatrick 
3323cab2bb3Spatrick // Whether the addresses are sign-extended from the VMA range to the word.
3333cab2bb3Spatrick // The SPARC64 Linux port implements this to split the VMA space into two
3343cab2bb3Spatrick // non-contiguous halves with a huge hole in the middle.
3353cab2bb3Spatrick #if defined(__sparc__) && SANITIZER_WORDSIZE == 64
3363cab2bb3Spatrick #  define SANITIZER_SIGN_EXTENDED_ADDRESSES 1
3373cab2bb3Spatrick #else
3383cab2bb3Spatrick #  define SANITIZER_SIGN_EXTENDED_ADDRESSES 0
3393cab2bb3Spatrick #endif
3403cab2bb3Spatrick 
3413cab2bb3Spatrick // udi16 syscalls can only be used when the following conditions are
3423cab2bb3Spatrick // met:
3433cab2bb3Spatrick // * target is one of arm32, x86-32, sparc32, sh or m68k
3443cab2bb3Spatrick // * libc version is libc5, glibc-2.0, glibc-2.1 or glibc-2.2 to 2.15
3453cab2bb3Spatrick //   built against > linux-2.2 kernel headers
3463cab2bb3Spatrick // Since we don't want to include libc headers here, we check the
3473cab2bb3Spatrick // target only.
3483cab2bb3Spatrick #if defined(__arm__) || SANITIZER_X32 || defined(__sparc__)
3493cab2bb3Spatrick #  define SANITIZER_USES_UID16_SYSCALLS 1
3503cab2bb3Spatrick #else
3513cab2bb3Spatrick #  define SANITIZER_USES_UID16_SYSCALLS 0
3523cab2bb3Spatrick #endif
3533cab2bb3Spatrick 
3543cab2bb3Spatrick #if defined(__mips__)
3553cab2bb3Spatrick #  define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 10)
3563cab2bb3Spatrick #else
3573cab2bb3Spatrick #  define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 12)
3583cab2bb3Spatrick #endif
3593cab2bb3Spatrick 
3603cab2bb3Spatrick /// \macro MSC_PREREQ
3613cab2bb3Spatrick /// \brief Is the compiler MSVC of at least the specified version?
3623cab2bb3Spatrick /// The common \param version values to check for are:
3633cab2bb3Spatrick ///  * 1800: Microsoft Visual Studio 2013 / 12.0
3643cab2bb3Spatrick ///  * 1900: Microsoft Visual Studio 2015 / 14.0
3653cab2bb3Spatrick #ifdef _MSC_VER
3663cab2bb3Spatrick #  define MSC_PREREQ(version) (_MSC_VER >= (version))
3673cab2bb3Spatrick #else
3683cab2bb3Spatrick #  define MSC_PREREQ(version) 0
3693cab2bb3Spatrick #endif
3703cab2bb3Spatrick 
371*68dd5bb1Srobert #if SANITIZER_APPLE && defined(__x86_64__)
3723cab2bb3Spatrick #  define SANITIZER_NON_UNIQUE_TYPEINFO 0
3733cab2bb3Spatrick #else
3743cab2bb3Spatrick #  define SANITIZER_NON_UNIQUE_TYPEINFO 1
3753cab2bb3Spatrick #endif
3763cab2bb3Spatrick 
3773cab2bb3Spatrick // On linux, some architectures had an ABI transition from 64-bit long double
3783cab2bb3Spatrick // (ie. same as double) to 128-bit long double.  On those, glibc symbols
3793cab2bb3Spatrick // involving long doubles come in two versions, and we need to pass the
3803cab2bb3Spatrick // correct one to dlvsym when intercepting them.
3813cab2bb3Spatrick #if SANITIZER_LINUX && (SANITIZER_S390 || SANITIZER_PPC32 || SANITIZER_PPC64V1)
3823cab2bb3Spatrick #  define SANITIZER_NLDBL_VERSION "GLIBC_2.4"
3833cab2bb3Spatrick #endif
3843cab2bb3Spatrick 
3853cab2bb3Spatrick #if SANITIZER_GO == 0
3863cab2bb3Spatrick #  define SANITIZER_GO 0
3873cab2bb3Spatrick #endif
3883cab2bb3Spatrick 
3893cab2bb3Spatrick // On PowerPC and ARM Thumb, calling pthread_exit() causes LSan to detect leaks.
3903cab2bb3Spatrick // pthread_exit() performs unwinding that leads to dlopen'ing libgcc_s.so.
3913cab2bb3Spatrick // dlopen mallocs "libgcc_s.so" string which confuses LSan, it fails to realize
3923cab2bb3Spatrick // that this allocation happens in dynamic linker and should be ignored.
3933cab2bb3Spatrick #if SANITIZER_PPC || defined(__thumb__)
3943cab2bb3Spatrick #  define SANITIZER_SUPPRESS_LEAK_ON_PTHREAD_EXIT 1
3953cab2bb3Spatrick #else
3963cab2bb3Spatrick #  define SANITIZER_SUPPRESS_LEAK_ON_PTHREAD_EXIT 0
3973cab2bb3Spatrick #endif
3983cab2bb3Spatrick 
399*68dd5bb1Srobert #if SANITIZER_FREEBSD || SANITIZER_APPLE || SANITIZER_NETBSD || SANITIZER_SOLARIS
4003cab2bb3Spatrick #  define SANITIZER_MADVISE_DONTNEED MADV_FREE
4013cab2bb3Spatrick #else
4023cab2bb3Spatrick #  define SANITIZER_MADVISE_DONTNEED MADV_DONTNEED
4033cab2bb3Spatrick #endif
4043cab2bb3Spatrick 
4053cab2bb3Spatrick // Older gcc have issues aligning to a constexpr, and require an integer.
4063cab2bb3Spatrick // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56859 among others.
4073cab2bb3Spatrick #if defined(__powerpc__) || defined(__powerpc64__)
4083cab2bb3Spatrick #  define SANITIZER_CACHE_LINE_SIZE 128
4093cab2bb3Spatrick #else
4103cab2bb3Spatrick #  define SANITIZER_CACHE_LINE_SIZE 64
4113cab2bb3Spatrick #endif
4123cab2bb3Spatrick 
413d89ec533Spatrick // Enable offline markup symbolizer for Fuchsia.
414d89ec533Spatrick #if SANITIZER_FUCHSIA
4153cab2bb3Spatrick #  define SANITIZER_SYMBOLIZER_MARKUP 1
4163cab2bb3Spatrick #else
4173cab2bb3Spatrick #  define SANITIZER_SYMBOLIZER_MARKUP 0
4183cab2bb3Spatrick #endif
4193cab2bb3Spatrick 
4203cab2bb3Spatrick // Enable ability to support sanitizer initialization that is
4213cab2bb3Spatrick // compatible with the sanitizer library being loaded via
4223cab2bb3Spatrick // `dlopen()`.
423*68dd5bb1Srobert #if SANITIZER_APPLE
4243cab2bb3Spatrick #  define SANITIZER_SUPPORTS_INIT_FOR_DLOPEN 1
4253cab2bb3Spatrick #else
4263cab2bb3Spatrick #  define SANITIZER_SUPPORTS_INIT_FOR_DLOPEN 0
4273cab2bb3Spatrick #endif
4283cab2bb3Spatrick 
429*68dd5bb1Srobert // SANITIZER_SUPPORTS_THREADLOCAL
430*68dd5bb1Srobert // 1 - THREADLOCAL macro is supported by target
431*68dd5bb1Srobert // 0 - THREADLOCAL macro is not supported by target
432*68dd5bb1Srobert #ifndef __has_feature
433*68dd5bb1Srobert // TODO: Support other compilers here
434*68dd5bb1Srobert #  define SANITIZER_SUPPORTS_THREADLOCAL 1
435*68dd5bb1Srobert #else
436*68dd5bb1Srobert #  if __has_feature(tls)
437*68dd5bb1Srobert #    define SANITIZER_SUPPORTS_THREADLOCAL 1
438*68dd5bb1Srobert #  else
439*68dd5bb1Srobert #    define SANITIZER_SUPPORTS_THREADLOCAL 0
440*68dd5bb1Srobert #  endif
441*68dd5bb1Srobert #endif
442*68dd5bb1Srobert 
443*68dd5bb1Srobert #if defined(__thumb__) && defined(__linux__)
444*68dd5bb1Srobert // Workaround for
445*68dd5bb1Srobert // https://lab.llvm.org/buildbot/#/builders/clang-thumbv7-full-2stage
446*68dd5bb1Srobert // or
447*68dd5bb1Srobert // https://lab.llvm.org/staging/#/builders/clang-thumbv7-full-2stage
448*68dd5bb1Srobert // It fails *rss_limit_mb_test* without meaningful errors.
449*68dd5bb1Srobert #  define SANITIZER_START_BACKGROUND_THREAD_IN_ASAN_INTERNAL 1
450*68dd5bb1Srobert #else
451*68dd5bb1Srobert #  define SANITIZER_START_BACKGROUND_THREAD_IN_ASAN_INTERNAL 0
452*68dd5bb1Srobert #endif
453*68dd5bb1Srobert 
4543cab2bb3Spatrick #endif  // SANITIZER_PLATFORM_H
455