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