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