xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_platform.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===-- sanitizer_platform.h ------------------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // Common platform macros.
100b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #ifndef SANITIZER_PLATFORM_H
130b57cec5SDimitry Andric #define SANITIZER_PLATFORM_H
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric #if !defined(__linux__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && \
16fe6060f1SDimitry Andric     !defined(__APPLE__) && !defined(_WIN32) && !defined(__Fuchsia__) &&     \
170b57cec5SDimitry Andric     !(defined(__sun__) && defined(__svr4__))
180b57cec5SDimitry Andric #  error "This operating system is not supported"
190b57cec5SDimitry Andric #endif
200b57cec5SDimitry Andric 
21e8d8bef9SDimitry Andric // Get __GLIBC__ on a glibc platform. Exclude Android: features.h includes C
22e8d8bef9SDimitry Andric // function declarations into a .S file which doesn't compile.
23e8d8bef9SDimitry Andric // https://crbug.com/1162741
24e8d8bef9SDimitry Andric #if __has_include(<features.h>) && !defined(__ANDROID__)
25e8d8bef9SDimitry Andric #  include <features.h>
26e8d8bef9SDimitry Andric #endif
27e8d8bef9SDimitry Andric 
280b57cec5SDimitry Andric #if defined(__linux__)
290b57cec5SDimitry Andric #  define SANITIZER_LINUX 1
300b57cec5SDimitry Andric #else
310b57cec5SDimitry Andric #  define SANITIZER_LINUX 0
320b57cec5SDimitry Andric #endif
330b57cec5SDimitry Andric 
34e8d8bef9SDimitry Andric #if defined(__GLIBC__)
35e8d8bef9SDimitry Andric #  define SANITIZER_GLIBC 1
36e8d8bef9SDimitry Andric #else
37e8d8bef9SDimitry Andric #  define SANITIZER_GLIBC 0
38e8d8bef9SDimitry Andric #endif
39e8d8bef9SDimitry Andric 
400b57cec5SDimitry Andric #if defined(__FreeBSD__)
410b57cec5SDimitry Andric #  define SANITIZER_FREEBSD 1
420b57cec5SDimitry Andric #else
430b57cec5SDimitry Andric #  define SANITIZER_FREEBSD 0
440b57cec5SDimitry Andric #endif
450b57cec5SDimitry Andric 
460b57cec5SDimitry Andric #if defined(__NetBSD__)
470b57cec5SDimitry Andric #  define SANITIZER_NETBSD 1
480b57cec5SDimitry Andric #else
490b57cec5SDimitry Andric #  define SANITIZER_NETBSD 0
500b57cec5SDimitry Andric #endif
510b57cec5SDimitry Andric 
520b57cec5SDimitry Andric #if defined(__sun__) && defined(__svr4__)
530b57cec5SDimitry Andric #  define SANITIZER_SOLARIS 1
540b57cec5SDimitry Andric #else
550b57cec5SDimitry Andric #  define SANITIZER_SOLARIS 0
560b57cec5SDimitry Andric #endif
570b57cec5SDimitry Andric 
5881ad6265SDimitry Andric // - SANITIZER_APPLE: all Apple code
5981ad6265SDimitry Andric //   - TARGET_OS_OSX: macOS
6081ad6265SDimitry Andric //   - SANITIZER_IOS: devices (iOS and iOS-like)
6181ad6265SDimitry Andric //     - SANITIZER_WATCHOS
6281ad6265SDimitry Andric //     - SANITIZER_TVOS
6381ad6265SDimitry Andric //   - SANITIZER_IOSSIM: simulators (iOS and iOS-like)
6481ad6265SDimitry Andric //   - SANITIZER_DRIVERKIT
650b57cec5SDimitry Andric #if defined(__APPLE__)
6681ad6265SDimitry Andric #  define SANITIZER_APPLE 1
670b57cec5SDimitry Andric #  include <TargetConditionals.h>
68fe6060f1SDimitry Andric #  if TARGET_OS_OSX
69fe6060f1SDimitry Andric #    define SANITIZER_OSX 1
70fe6060f1SDimitry Andric #  else
71fe6060f1SDimitry Andric #    define SANITIZER_OSX 0
72fe6060f1SDimitry Andric #  endif
730b57cec5SDimitry Andric #  if TARGET_OS_IPHONE
740b57cec5SDimitry Andric #    define SANITIZER_IOS 1
750b57cec5SDimitry Andric #  else
760b57cec5SDimitry Andric #    define SANITIZER_IOS 0
770b57cec5SDimitry Andric #  endif
7881ad6265SDimitry Andric #  if TARGET_OS_WATCH
7981ad6265SDimitry Andric #    define SANITIZER_WATCHOS 1
8081ad6265SDimitry Andric #  else
8181ad6265SDimitry Andric #    define SANITIZER_WATCHOS 0
8281ad6265SDimitry Andric #  endif
8381ad6265SDimitry Andric #  if TARGET_OS_TV
8481ad6265SDimitry Andric #    define SANITIZER_TVOS 1
8581ad6265SDimitry Andric #  else
8681ad6265SDimitry Andric #    define SANITIZER_TVOS 0
8781ad6265SDimitry Andric #  endif
880b57cec5SDimitry Andric #  if TARGET_OS_SIMULATOR
890b57cec5SDimitry Andric #    define SANITIZER_IOSSIM 1
900b57cec5SDimitry Andric #  else
910b57cec5SDimitry Andric #    define SANITIZER_IOSSIM 0
920b57cec5SDimitry Andric #  endif
9361cfbce3SDimitry Andric #  if defined(TARGET_OS_DRIVERKIT) && TARGET_OS_DRIVERKIT
9481ad6265SDimitry Andric #    define SANITIZER_DRIVERKIT 1
950b57cec5SDimitry Andric #  else
9681ad6265SDimitry Andric #    define SANITIZER_DRIVERKIT 0
9781ad6265SDimitry Andric #  endif
9881ad6265SDimitry Andric #else
9981ad6265SDimitry Andric #  define SANITIZER_APPLE 0
100fe6060f1SDimitry Andric #  define SANITIZER_OSX 0
10181ad6265SDimitry Andric #  define SANITIZER_IOS 0
1020b57cec5SDimitry Andric #  define SANITIZER_WATCHOS 0
1030b57cec5SDimitry Andric #  define SANITIZER_TVOS 0
10481ad6265SDimitry Andric #  define SANITIZER_IOSSIM 0
10581ad6265SDimitry Andric #  define SANITIZER_DRIVERKIT 0
1060b57cec5SDimitry Andric #endif
1070b57cec5SDimitry Andric 
1080b57cec5SDimitry Andric #if defined(_WIN32)
1090b57cec5SDimitry Andric #  define SANITIZER_WINDOWS 1
1100b57cec5SDimitry Andric #else
1110b57cec5SDimitry Andric #  define SANITIZER_WINDOWS 0
1120b57cec5SDimitry Andric #endif
1130b57cec5SDimitry Andric 
1140b57cec5SDimitry Andric #if defined(_WIN64)
1150b57cec5SDimitry Andric #  define SANITIZER_WINDOWS64 1
1160b57cec5SDimitry Andric #else
1170b57cec5SDimitry Andric #  define SANITIZER_WINDOWS64 0
1180b57cec5SDimitry Andric #endif
1190b57cec5SDimitry Andric 
1200b57cec5SDimitry Andric #if defined(__ANDROID__)
1210b57cec5SDimitry Andric #  define SANITIZER_ANDROID 1
1220b57cec5SDimitry Andric #else
1230b57cec5SDimitry Andric #  define SANITIZER_ANDROID 0
1240b57cec5SDimitry Andric #endif
1250b57cec5SDimitry Andric 
1260b57cec5SDimitry Andric #if defined(__Fuchsia__)
1270b57cec5SDimitry Andric #  define SANITIZER_FUCHSIA 1
1280b57cec5SDimitry Andric #else
1290b57cec5SDimitry Andric #  define SANITIZER_FUCHSIA 0
1300b57cec5SDimitry Andric #endif
1310b57cec5SDimitry Andric 
13281ad6265SDimitry Andric // Assume linux that is not glibc or android is musl libc.
13381ad6265SDimitry Andric #if SANITIZER_LINUX && !SANITIZER_GLIBC && !SANITIZER_ANDROID
13481ad6265SDimitry Andric #  define SANITIZER_MUSL 1
13581ad6265SDimitry Andric #else
13681ad6265SDimitry Andric #  define SANITIZER_MUSL 0
13781ad6265SDimitry Andric #endif
13881ad6265SDimitry Andric 
1390b57cec5SDimitry Andric #define SANITIZER_POSIX                                     \
14081ad6265SDimitry Andric   (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_APPLE || \
141e8d8bef9SDimitry Andric    SANITIZER_NETBSD || SANITIZER_SOLARIS)
1420b57cec5SDimitry Andric 
1430b57cec5SDimitry Andric #if __LP64__ || defined(_WIN64)
1440b57cec5SDimitry Andric #  define SANITIZER_WORDSIZE 64
1450b57cec5SDimitry Andric #else
1460b57cec5SDimitry Andric #  define SANITIZER_WORDSIZE 32
1470b57cec5SDimitry Andric #endif
1480b57cec5SDimitry Andric 
1490b57cec5SDimitry Andric #if SANITIZER_WORDSIZE == 64
1500b57cec5SDimitry Andric #  define FIRST_32_SECOND_64(a, b) (b)
1510b57cec5SDimitry Andric #else
1520b57cec5SDimitry Andric #  define FIRST_32_SECOND_64(a, b) (a)
1530b57cec5SDimitry Andric #endif
1540b57cec5SDimitry Andric 
1550b57cec5SDimitry Andric #if defined(__x86_64__) && !defined(_LP64)
1560b57cec5SDimitry Andric #  define SANITIZER_X32 1
1570b57cec5SDimitry Andric #else
1580b57cec5SDimitry Andric #  define SANITIZER_X32 0
1590b57cec5SDimitry Andric #endif
1600b57cec5SDimitry Andric 
1610eae32dcSDimitry Andric #if defined(__x86_64__) || defined(_M_X64)
1620eae32dcSDimitry Andric #  define SANITIZER_X64 1
1630eae32dcSDimitry Andric #else
1640eae32dcSDimitry Andric #  define SANITIZER_X64 0
1650eae32dcSDimitry Andric #endif
1660eae32dcSDimitry Andric 
1675ffd83dbSDimitry Andric #if defined(__i386__) || defined(_M_IX86)
1685ffd83dbSDimitry Andric #  define SANITIZER_I386 1
1695ffd83dbSDimitry Andric #else
1705ffd83dbSDimitry Andric #  define SANITIZER_I386 0
1715ffd83dbSDimitry Andric #endif
1725ffd83dbSDimitry Andric 
1730b57cec5SDimitry Andric #if defined(__mips__)
1740b57cec5SDimitry Andric #  define SANITIZER_MIPS 1
175753f127fSDimitry Andric #  if defined(__mips64) && _MIPS_SIM == _ABI64
1760b57cec5SDimitry Andric #    define SANITIZER_MIPS32 0
1770b57cec5SDimitry Andric #    define SANITIZER_MIPS64 1
1780b57cec5SDimitry Andric #  else
1790b57cec5SDimitry Andric #    define SANITIZER_MIPS32 1
1800b57cec5SDimitry Andric #    define SANITIZER_MIPS64 0
1810b57cec5SDimitry Andric #  endif
1820b57cec5SDimitry Andric #else
1830b57cec5SDimitry Andric #  define SANITIZER_MIPS 0
1840b57cec5SDimitry Andric #  define SANITIZER_MIPS32 0
1850b57cec5SDimitry Andric #  define SANITIZER_MIPS64 0
1860b57cec5SDimitry Andric #endif
1870b57cec5SDimitry Andric 
1880b57cec5SDimitry Andric #if defined(__s390__)
1890b57cec5SDimitry Andric #  define SANITIZER_S390 1
1900b57cec5SDimitry Andric #  if defined(__s390x__)
1910b57cec5SDimitry Andric #    define SANITIZER_S390_31 0
1920b57cec5SDimitry Andric #    define SANITIZER_S390_64 1
1930b57cec5SDimitry Andric #  else
1940b57cec5SDimitry Andric #    define SANITIZER_S390_31 1
1950b57cec5SDimitry Andric #    define SANITIZER_S390_64 0
1960b57cec5SDimitry Andric #  endif
1970b57cec5SDimitry Andric #else
1980b57cec5SDimitry Andric #  define SANITIZER_S390 0
1990b57cec5SDimitry Andric #  define SANITIZER_S390_31 0
2000b57cec5SDimitry Andric #  define SANITIZER_S390_64 0
2010b57cec5SDimitry Andric #endif
2020b57cec5SDimitry Andric 
20381ad6265SDimitry Andric #if defined(__sparc__)
20481ad6265SDimitry Andric #  define SANITIZER_SPARC 1
20581ad6265SDimitry Andric #  if defined(__arch64__)
20681ad6265SDimitry Andric #    define SANITIZER_SPARC32 0
20781ad6265SDimitry Andric #    define SANITIZER_SPARC64 1
20881ad6265SDimitry Andric #  else
20981ad6265SDimitry Andric #    define SANITIZER_SPARC32 1
21081ad6265SDimitry Andric #    define SANITIZER_SPARC64 0
21181ad6265SDimitry Andric #  endif
21281ad6265SDimitry Andric #else
21381ad6265SDimitry Andric #  define SANITIZER_SPARC 0
21481ad6265SDimitry Andric #  define SANITIZER_SPARC32 0
21581ad6265SDimitry Andric #  define SANITIZER_SPARC64 0
21681ad6265SDimitry Andric #endif
21781ad6265SDimitry Andric 
2180b57cec5SDimitry Andric #if defined(__powerpc__)
2190b57cec5SDimitry Andric #  define SANITIZER_PPC 1
2200b57cec5SDimitry Andric #  if defined(__powerpc64__)
2210b57cec5SDimitry Andric #    define SANITIZER_PPC32 0
2220b57cec5SDimitry Andric #    define SANITIZER_PPC64 1
2230b57cec5SDimitry Andric // 64-bit PPC has two ABIs (v1 and v2).  The old powerpc64 target is
2240b57cec5SDimitry Andric // big-endian, and uses v1 ABI (known for its function descriptors),
2250b57cec5SDimitry Andric // while the new powerpc64le target is little-endian and uses v2.
2260b57cec5SDimitry Andric // In theory, you could convince gcc to compile for their evil twins
2270b57cec5SDimitry Andric // (eg. big-endian v2), but you won't find such combinations in the wild
2280b57cec5SDimitry Andric // (it'd require bootstrapping a whole system, which would be quite painful
2290b57cec5SDimitry Andric // - there's no target triple for that).  LLVM doesn't support them either.
2300b57cec5SDimitry Andric #    if _CALL_ELF == 2
2310b57cec5SDimitry Andric #      define SANITIZER_PPC64V1 0
2320b57cec5SDimitry Andric #      define SANITIZER_PPC64V2 1
2330b57cec5SDimitry Andric #    else
2340b57cec5SDimitry Andric #      define SANITIZER_PPC64V1 1
2350b57cec5SDimitry Andric #      define SANITIZER_PPC64V2 0
2360b57cec5SDimitry Andric #    endif
2370b57cec5SDimitry Andric #  else
2380b57cec5SDimitry Andric #    define SANITIZER_PPC32 1
2390b57cec5SDimitry Andric #    define SANITIZER_PPC64 0
2400b57cec5SDimitry Andric #    define SANITIZER_PPC64V1 0
2410b57cec5SDimitry Andric #    define SANITIZER_PPC64V2 0
2420b57cec5SDimitry Andric #  endif
2430b57cec5SDimitry Andric #else
2440b57cec5SDimitry Andric #  define SANITIZER_PPC 0
2450b57cec5SDimitry Andric #  define SANITIZER_PPC32 0
2460b57cec5SDimitry Andric #  define SANITIZER_PPC64 0
2470b57cec5SDimitry Andric #  define SANITIZER_PPC64V1 0
2480b57cec5SDimitry Andric #  define SANITIZER_PPC64V2 0
2490b57cec5SDimitry Andric #endif
2500b57cec5SDimitry Andric 
2510eae32dcSDimitry Andric #if defined(__arm__) || defined(_M_ARM)
2520b57cec5SDimitry Andric #  define SANITIZER_ARM 1
2530b57cec5SDimitry Andric #else
2540b57cec5SDimitry Andric #  define SANITIZER_ARM 0
2550b57cec5SDimitry Andric #endif
2560b57cec5SDimitry Andric 
2570eae32dcSDimitry Andric #if defined(__aarch64__) || defined(_M_ARM64)
2580eae32dcSDimitry Andric #  define SANITIZER_ARM64 1
2590eae32dcSDimitry Andric #else
2600eae32dcSDimitry Andric #  define SANITIZER_ARM64 0
2610eae32dcSDimitry Andric #endif
2620eae32dcSDimitry Andric 
2635f757f3fSDimitry Andric #if SANITIZER_WINDOWS64 && SANITIZER_ARM64
2645f757f3fSDimitry Andric #  define SANITIZER_WINDOWS_ARM64 1
2655f757f3fSDimitry Andric #  define SANITIZER_WINDOWS_x64 0
2665f757f3fSDimitry Andric #elif SANITIZER_WINDOWS64 && !SANITIZER_ARM64
2675f757f3fSDimitry Andric #  define SANITIZER_WINDOWS_ARM64 0
2685f757f3fSDimitry Andric #  define SANITIZER_WINDOWS_x64 1
2695f757f3fSDimitry Andric #else
2705f757f3fSDimitry Andric #  define SANITIZER_WINDOWS_ARM64 0
2715f757f3fSDimitry Andric #  define SANITIZER_WINDOWS_x64 0
2725f757f3fSDimitry Andric #endif
2735f757f3fSDimitry Andric 
2740b57cec5SDimitry Andric #if SANITIZER_SOLARIS && SANITIZER_WORDSIZE == 32
2750b57cec5SDimitry Andric #  define SANITIZER_SOLARIS32 1
2760b57cec5SDimitry Andric #else
2770b57cec5SDimitry Andric #  define SANITIZER_SOLARIS32 0
2780b57cec5SDimitry Andric #endif
2790b57cec5SDimitry Andric 
280e8d8bef9SDimitry Andric #if defined(__riscv) && (__riscv_xlen == 64)
281e8d8bef9SDimitry Andric #  define SANITIZER_RISCV64 1
282e8d8bef9SDimitry Andric #else
283e8d8bef9SDimitry Andric #  define SANITIZER_RISCV64 0
284e8d8bef9SDimitry Andric #endif
285e8d8bef9SDimitry Andric 
286fcaf7f86SDimitry Andric #if defined(__loongarch_lp64)
287fcaf7f86SDimitry Andric #  define SANITIZER_LOONGARCH64 1
288fcaf7f86SDimitry Andric #else
289fcaf7f86SDimitry Andric #  define SANITIZER_LOONGARCH64 0
290fcaf7f86SDimitry Andric #endif
291fcaf7f86SDimitry Andric 
2920b57cec5SDimitry Andric // By default we allow to use SizeClassAllocator64 on 64-bit platform.
293bdd1243dSDimitry Andric // But in some cases SizeClassAllocator64 does not work well and we need to
294bdd1243dSDimitry Andric // fallback to SizeClassAllocator32.
2950b57cec5SDimitry Andric // For such platforms build this code with -DSANITIZER_CAN_USE_ALLOCATOR64=0 or
2960b57cec5SDimitry Andric // change the definition of SANITIZER_CAN_USE_ALLOCATOR64 here.
2970b57cec5SDimitry Andric #ifndef SANITIZER_CAN_USE_ALLOCATOR64
298*0fca6ea1SDimitry Andric #  if (SANITIZER_RISCV64 && !SANITIZER_FUCHSIA && !SANITIZER_LINUX) || \
299*0fca6ea1SDimitry Andric       SANITIZER_IOS || SANITIZER_DRIVERKIT
300bdd1243dSDimitry Andric #    define SANITIZER_CAN_USE_ALLOCATOR64 0
301bdd1243dSDimitry Andric #  elif defined(__mips64) || defined(__hexagon__)
3020b57cec5SDimitry Andric #    define SANITIZER_CAN_USE_ALLOCATOR64 0
3030b57cec5SDimitry Andric #  else
3040b57cec5SDimitry Andric #    define SANITIZER_CAN_USE_ALLOCATOR64 (SANITIZER_WORDSIZE == 64)
3050b57cec5SDimitry Andric #  endif
3060b57cec5SDimitry Andric #endif
3070b57cec5SDimitry Andric 
3080b57cec5SDimitry Andric // The range of addresses which can be returned my mmap.
3090b57cec5SDimitry Andric // FIXME: this value should be different on different platforms.  Larger values
3100b57cec5SDimitry Andric // will still work but will consume more memory for TwoLevelByteMap.
3110b57cec5SDimitry Andric #if defined(__mips__)
312e8d8bef9SDimitry Andric #  if SANITIZER_GO && defined(__mips64)
313e8d8bef9SDimitry Andric #    define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47)
314e8d8bef9SDimitry Andric #  else
3150b57cec5SDimitry Andric #    define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 40)
316e8d8bef9SDimitry Andric #  endif
317e8d8bef9SDimitry Andric #elif SANITIZER_RISCV64
3185f757f3fSDimitry Andric // FIXME: Rather than hardcoding the VMA here, we should rely on
3195f757f3fSDimitry Andric // GetMaxUserVirtualAddress(). This will require some refactoring though since
3205f757f3fSDimitry Andric // many places either hardcode some value or SANITIZER_MMAP_RANGE_SIZE is
3215f757f3fSDimitry Andric // assumed to be some constant integer.
3225f757f3fSDimitry Andric #  if SANITIZER_FUCHSIA
3235f757f3fSDimitry Andric #    define SANITIZER_MMAP_RANGE_SIZE (1ULL << 38)
3245f757f3fSDimitry Andric #  else
325*0fca6ea1SDimitry Andric #    define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 56)
3265f757f3fSDimitry Andric #  endif
3270b57cec5SDimitry Andric #elif defined(__aarch64__)
32881ad6265SDimitry Andric #  if SANITIZER_APPLE
329fe6060f1SDimitry Andric #    if SANITIZER_OSX || SANITIZER_IOSSIM
3300eae32dcSDimitry Andric #      define SANITIZER_MMAP_RANGE_SIZE \
3310eae32dcSDimitry Andric         FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47)
332fe6060f1SDimitry Andric #    else
3330b57cec5SDimitry Andric // Darwin iOS/ARM64 has a 36-bit VMA, 64GiB VM
3340eae32dcSDimitry Andric #      define SANITIZER_MMAP_RANGE_SIZE \
3350eae32dcSDimitry Andric         FIRST_32_SECOND_64(1ULL << 32, 1ULL << 36)
336fe6060f1SDimitry Andric #    endif
3370b57cec5SDimitry Andric #  else
3380b57cec5SDimitry Andric #    define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 48)
3390b57cec5SDimitry Andric #  endif
3400b57cec5SDimitry Andric #elif defined(__sparc__)
3410b57cec5SDimitry Andric #  define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 52)
3420b57cec5SDimitry Andric #else
3430b57cec5SDimitry Andric #  define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47)
3440b57cec5SDimitry Andric #endif
3450b57cec5SDimitry Andric 
3460b57cec5SDimitry Andric // Whether the addresses are sign-extended from the VMA range to the word.
3470b57cec5SDimitry Andric // The SPARC64 Linux port implements this to split the VMA space into two
3480b57cec5SDimitry Andric // non-contiguous halves with a huge hole in the middle.
3490b57cec5SDimitry Andric #if defined(__sparc__) && SANITIZER_WORDSIZE == 64
3500b57cec5SDimitry Andric #  define SANITIZER_SIGN_EXTENDED_ADDRESSES 1
3510b57cec5SDimitry Andric #else
3520b57cec5SDimitry Andric #  define SANITIZER_SIGN_EXTENDED_ADDRESSES 0
3530b57cec5SDimitry Andric #endif
3540b57cec5SDimitry Andric 
3550b57cec5SDimitry Andric // udi16 syscalls can only be used when the following conditions are
3560b57cec5SDimitry Andric // met:
3570b57cec5SDimitry Andric // * target is one of arm32, x86-32, sparc32, sh or m68k
3580b57cec5SDimitry Andric // * libc version is libc5, glibc-2.0, glibc-2.1 or glibc-2.2 to 2.15
3590b57cec5SDimitry Andric //   built against > linux-2.2 kernel headers
3600b57cec5SDimitry Andric // Since we don't want to include libc headers here, we check the
3610b57cec5SDimitry Andric // target only.
3620b57cec5SDimitry Andric #if defined(__arm__) || SANITIZER_X32 || defined(__sparc__)
3630b57cec5SDimitry Andric #  define SANITIZER_USES_UID16_SYSCALLS 1
3640b57cec5SDimitry Andric #else
3650b57cec5SDimitry Andric #  define SANITIZER_USES_UID16_SYSCALLS 0
3660b57cec5SDimitry Andric #endif
3670b57cec5SDimitry Andric 
3680b57cec5SDimitry Andric #if defined(__mips__)
3690b57cec5SDimitry Andric #  define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 10)
3700b57cec5SDimitry Andric #else
3710b57cec5SDimitry Andric #  define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 12)
3720b57cec5SDimitry Andric #endif
3730b57cec5SDimitry Andric 
3740b57cec5SDimitry Andric /// \macro MSC_PREREQ
3750b57cec5SDimitry Andric /// \brief Is the compiler MSVC of at least the specified version?
3760b57cec5SDimitry Andric /// The common \param version values to check for are:
3770b57cec5SDimitry Andric ///  * 1800: Microsoft Visual Studio 2013 / 12.0
3780b57cec5SDimitry Andric ///  * 1900: Microsoft Visual Studio 2015 / 14.0
3790b57cec5SDimitry Andric #ifdef _MSC_VER
3800b57cec5SDimitry Andric #  define MSC_PREREQ(version) (_MSC_VER >= (version))
3810b57cec5SDimitry Andric #else
3820b57cec5SDimitry Andric #  define MSC_PREREQ(version) 0
3830b57cec5SDimitry Andric #endif
3840b57cec5SDimitry Andric 
38581ad6265SDimitry Andric #if SANITIZER_APPLE && defined(__x86_64__)
3860b57cec5SDimitry Andric #  define SANITIZER_NON_UNIQUE_TYPEINFO 0
3870b57cec5SDimitry Andric #else
3880b57cec5SDimitry Andric #  define SANITIZER_NON_UNIQUE_TYPEINFO 1
3890b57cec5SDimitry Andric #endif
3900b57cec5SDimitry Andric 
3910b57cec5SDimitry Andric // On linux, some architectures had an ABI transition from 64-bit long double
3920b57cec5SDimitry Andric // (ie. same as double) to 128-bit long double.  On those, glibc symbols
3930b57cec5SDimitry Andric // involving long doubles come in two versions, and we need to pass the
3940b57cec5SDimitry Andric // correct one to dlvsym when intercepting them.
3950b57cec5SDimitry Andric #if SANITIZER_LINUX && (SANITIZER_S390 || SANITIZER_PPC32 || SANITIZER_PPC64V1)
3960b57cec5SDimitry Andric #  define SANITIZER_NLDBL_VERSION "GLIBC_2.4"
3970b57cec5SDimitry Andric #endif
3980b57cec5SDimitry Andric 
3990b57cec5SDimitry Andric #if SANITIZER_GO == 0
4000b57cec5SDimitry Andric #  define SANITIZER_GO 0
4010b57cec5SDimitry Andric #endif
4020b57cec5SDimitry Andric 
4030b57cec5SDimitry Andric // On PowerPC and ARM Thumb, calling pthread_exit() causes LSan to detect leaks.
4040b57cec5SDimitry Andric // pthread_exit() performs unwinding that leads to dlopen'ing libgcc_s.so.
4050b57cec5SDimitry Andric // dlopen mallocs "libgcc_s.so" string which confuses LSan, it fails to realize
4060b57cec5SDimitry Andric // that this allocation happens in dynamic linker and should be ignored.
4070b57cec5SDimitry Andric #if SANITIZER_PPC || defined(__thumb__)
4080b57cec5SDimitry Andric #  define SANITIZER_SUPPRESS_LEAK_ON_PTHREAD_EXIT 1
4090b57cec5SDimitry Andric #else
4100b57cec5SDimitry Andric #  define SANITIZER_SUPPRESS_LEAK_ON_PTHREAD_EXIT 0
4110b57cec5SDimitry Andric #endif
4120b57cec5SDimitry Andric 
41381ad6265SDimitry Andric #if SANITIZER_FREEBSD || SANITIZER_APPLE || SANITIZER_NETBSD || SANITIZER_SOLARIS
4140b57cec5SDimitry Andric #  define SANITIZER_MADVISE_DONTNEED MADV_FREE
4150b57cec5SDimitry Andric #else
4160b57cec5SDimitry Andric #  define SANITIZER_MADVISE_DONTNEED MADV_DONTNEED
4170b57cec5SDimitry Andric #endif
4180b57cec5SDimitry Andric 
4190b57cec5SDimitry Andric // Older gcc have issues aligning to a constexpr, and require an integer.
4200b57cec5SDimitry Andric // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56859 among others.
4210b57cec5SDimitry Andric #if defined(__powerpc__) || defined(__powerpc64__)
4220b57cec5SDimitry Andric #  define SANITIZER_CACHE_LINE_SIZE 128
4230b57cec5SDimitry Andric #else
4240b57cec5SDimitry Andric #  define SANITIZER_CACHE_LINE_SIZE 64
4250b57cec5SDimitry Andric #endif
4260b57cec5SDimitry Andric 
427fe6060f1SDimitry Andric // Enable offline markup symbolizer for Fuchsia.
428fe6060f1SDimitry Andric #if SANITIZER_FUCHSIA
4290b57cec5SDimitry Andric #  define SANITIZER_SYMBOLIZER_MARKUP 1
4300b57cec5SDimitry Andric #else
4310b57cec5SDimitry Andric #  define SANITIZER_SYMBOLIZER_MARKUP 0
4320b57cec5SDimitry Andric #endif
4330b57cec5SDimitry Andric 
4340b57cec5SDimitry Andric // Enable ability to support sanitizer initialization that is
4350b57cec5SDimitry Andric // compatible with the sanitizer library being loaded via
4360b57cec5SDimitry Andric // `dlopen()`.
43781ad6265SDimitry Andric #if SANITIZER_APPLE
4380b57cec5SDimitry Andric #  define SANITIZER_SUPPORTS_INIT_FOR_DLOPEN 1
4390b57cec5SDimitry Andric #else
4400b57cec5SDimitry Andric #  define SANITIZER_SUPPORTS_INIT_FOR_DLOPEN 0
4410b57cec5SDimitry Andric #endif
4420b57cec5SDimitry Andric 
443349cc55cSDimitry Andric // SANITIZER_SUPPORTS_THREADLOCAL
444349cc55cSDimitry Andric // 1 - THREADLOCAL macro is supported by target
445349cc55cSDimitry Andric // 0 - THREADLOCAL macro is not supported by target
446349cc55cSDimitry Andric #ifndef __has_feature
447349cc55cSDimitry Andric // TODO: Support other compilers here
448349cc55cSDimitry Andric #  define SANITIZER_SUPPORTS_THREADLOCAL 1
449349cc55cSDimitry Andric #else
450349cc55cSDimitry Andric #  if __has_feature(tls)
451349cc55cSDimitry Andric #    define SANITIZER_SUPPORTS_THREADLOCAL 1
452349cc55cSDimitry Andric #  else
453349cc55cSDimitry Andric #    define SANITIZER_SUPPORTS_THREADLOCAL 0
454349cc55cSDimitry Andric #  endif
455349cc55cSDimitry Andric #endif
456349cc55cSDimitry Andric 
4570eae32dcSDimitry Andric #if defined(__thumb__) && defined(__linux__)
4580eae32dcSDimitry Andric // Workaround for
4590eae32dcSDimitry Andric // https://lab.llvm.org/buildbot/#/builders/clang-thumbv7-full-2stage
4600eae32dcSDimitry Andric // or
4610eae32dcSDimitry Andric // https://lab.llvm.org/staging/#/builders/clang-thumbv7-full-2stage
4620eae32dcSDimitry Andric // It fails *rss_limit_mb_test* without meaningful errors.
4630eae32dcSDimitry Andric #  define SANITIZER_START_BACKGROUND_THREAD_IN_ASAN_INTERNAL 1
4640eae32dcSDimitry Andric #else
4650eae32dcSDimitry Andric #  define SANITIZER_START_BACKGROUND_THREAD_IN_ASAN_INTERNAL 0
4660eae32dcSDimitry Andric #endif
4670eae32dcSDimitry Andric 
4680b57cec5SDimitry Andric #endif  // SANITIZER_PLATFORM_H
469