sanitizer_platform.h revision 341825
1//===-- sanitizer_platform.h ------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// Common platform macros. 11//===----------------------------------------------------------------------===// 12 13#ifndef SANITIZER_PLATFORM_H 14#define SANITIZER_PLATFORM_H 15 16#if !defined(__linux__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && \ 17 !defined(__OpenBSD__) && !defined(__APPLE__) && !defined(_WIN32) && \ 18 !defined(__Fuchsia__) && !defined(__rtems__) && \ 19 !(defined(__sun__) && defined(__svr4__)) 20# error "This operating system is not supported" 21#endif 22 23#if defined(__linux__) 24# define SANITIZER_LINUX 1 25#else 26# define SANITIZER_LINUX 0 27#endif 28 29#if defined(__FreeBSD__) 30# define SANITIZER_FREEBSD 1 31#else 32# define SANITIZER_FREEBSD 0 33#endif 34 35#if defined(__NetBSD__) 36# define SANITIZER_NETBSD 1 37#else 38# define SANITIZER_NETBSD 0 39#endif 40 41#if defined(__OpenBSD__) 42# define SANITIZER_OPENBSD 1 43#else 44# define SANITIZER_OPENBSD 0 45#endif 46 47#if defined(__sun__) && defined(__svr4__) 48# define SANITIZER_SOLARIS 1 49#else 50# define SANITIZER_SOLARIS 0 51#endif 52 53#if defined(__APPLE__) 54# define SANITIZER_MAC 1 55# include <TargetConditionals.h> 56# if TARGET_OS_IPHONE 57# define SANITIZER_IOS 1 58# else 59# define SANITIZER_IOS 0 60# endif 61# if TARGET_OS_SIMULATOR 62# define SANITIZER_IOSSIM 1 63# else 64# define SANITIZER_IOSSIM 0 65# endif 66#else 67# define SANITIZER_MAC 0 68# define SANITIZER_IOS 0 69# define SANITIZER_IOSSIM 0 70#endif 71 72#if defined(__APPLE__) && TARGET_OS_IPHONE && TARGET_OS_WATCH 73# define SANITIZER_WATCHOS 1 74#else 75# define SANITIZER_WATCHOS 0 76#endif 77 78#if defined(__APPLE__) && TARGET_OS_IPHONE && TARGET_OS_TV 79# define SANITIZER_TVOS 1 80#else 81# define SANITIZER_TVOS 0 82#endif 83 84#if defined(_WIN32) 85# define SANITIZER_WINDOWS 1 86#else 87# define SANITIZER_WINDOWS 0 88#endif 89 90#if defined(_WIN64) 91# define SANITIZER_WINDOWS64 1 92#else 93# define SANITIZER_WINDOWS64 0 94#endif 95 96#if defined(__ANDROID__) 97# define SANITIZER_ANDROID 1 98#else 99# define SANITIZER_ANDROID 0 100#endif 101 102#if defined(__Fuchsia__) 103# define SANITIZER_FUCHSIA 1 104#else 105# define SANITIZER_FUCHSIA 0 106#endif 107 108#if defined(__rtems__) 109# define SANITIZER_RTEMS 1 110#else 111# define SANITIZER_RTEMS 0 112#endif 113 114#define SANITIZER_POSIX \ 115 (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_MAC || \ 116 SANITIZER_NETBSD || SANITIZER_OPENBSD || SANITIZER_SOLARIS) 117 118#if __LP64__ || defined(_WIN64) 119# define SANITIZER_WORDSIZE 64 120#else 121# define SANITIZER_WORDSIZE 32 122#endif 123 124#if SANITIZER_WORDSIZE == 64 125# define FIRST_32_SECOND_64(a, b) (b) 126#else 127# define FIRST_32_SECOND_64(a, b) (a) 128#endif 129 130#if defined(__x86_64__) && !defined(_LP64) 131# define SANITIZER_X32 1 132#else 133# define SANITIZER_X32 0 134#endif 135 136#if defined(__mips__) 137# define SANITIZER_MIPS 1 138# if defined(__mips64) 139# define SANITIZER_MIPS32 0 140# define SANITIZER_MIPS64 1 141# else 142# define SANITIZER_MIPS32 1 143# define SANITIZER_MIPS64 0 144# endif 145#else 146# define SANITIZER_MIPS 0 147# define SANITIZER_MIPS32 0 148# define SANITIZER_MIPS64 0 149#endif 150 151#if defined(__s390__) 152# define SANITIZER_S390 1 153# if defined(__s390x__) 154# define SANITIZER_S390_31 0 155# define SANITIZER_S390_64 1 156# else 157# define SANITIZER_S390_31 1 158# define SANITIZER_S390_64 0 159# endif 160#else 161# define SANITIZER_S390 0 162# define SANITIZER_S390_31 0 163# define SANITIZER_S390_64 0 164#endif 165 166#if defined(__powerpc__) 167# define SANITIZER_PPC 1 168# if defined(__powerpc64__) 169# define SANITIZER_PPC32 0 170# define SANITIZER_PPC64 1 171// 64-bit PPC has two ABIs (v1 and v2). The old powerpc64 target is 172// big-endian, and uses v1 ABI (known for its function descriptors), 173// while the new powerpc64le target is little-endian and uses v2. 174// In theory, you could convince gcc to compile for their evil twins 175// (eg. big-endian v2), but you won't find such combinations in the wild 176// (it'd require bootstrapping a whole system, which would be quite painful 177// - there's no target triple for that). LLVM doesn't support them either. 178# if _CALL_ELF == 2 179# define SANITIZER_PPC64V1 0 180# define SANITIZER_PPC64V2 1 181# else 182# define SANITIZER_PPC64V1 1 183# define SANITIZER_PPC64V2 0 184# endif 185# else 186# define SANITIZER_PPC32 1 187# define SANITIZER_PPC64 0 188# define SANITIZER_PPC64V1 0 189# define SANITIZER_PPC64V2 0 190# endif 191#else 192# define SANITIZER_PPC 0 193# define SANITIZER_PPC32 0 194# define SANITIZER_PPC64 0 195# define SANITIZER_PPC64V1 0 196# define SANITIZER_PPC64V2 0 197#endif 198 199#if defined(__arm__) 200# define SANITIZER_ARM 1 201#else 202# define SANITIZER_ARM 0 203#endif 204 205#if SANITIZER_SOLARIS && SANITIZER_WORDSIZE == 32 206# define SANITIZER_SOLARIS32 1 207#else 208# define SANITIZER_SOLARIS32 0 209#endif 210 211#if defined(__myriad2__) 212# define SANITIZER_MYRIAD2 1 213#else 214# define SANITIZER_MYRIAD2 0 215#endif 216 217// By default we allow to use SizeClassAllocator64 on 64-bit platform. 218// But in some cases (e.g. AArch64's 39-bit address space) SizeClassAllocator64 219// does not work well and we need to fallback to SizeClassAllocator32. 220// For such platforms build this code with -DSANITIZER_CAN_USE_ALLOCATOR64=0 or 221// change the definition of SANITIZER_CAN_USE_ALLOCATOR64 here. 222#ifndef SANITIZER_CAN_USE_ALLOCATOR64 223# if (SANITIZER_ANDROID && defined(__aarch64__)) || SANITIZER_FUCHSIA 224# define SANITIZER_CAN_USE_ALLOCATOR64 1 225# elif defined(__mips64) || defined(__aarch64__) 226# define SANITIZER_CAN_USE_ALLOCATOR64 0 227# else 228# define SANITIZER_CAN_USE_ALLOCATOR64 (SANITIZER_WORDSIZE == 64) 229# endif 230#endif 231 232// The range of addresses which can be returned my mmap. 233// FIXME: this value should be different on different platforms. Larger values 234// will still work but will consume more memory for TwoLevelByteMap. 235#if defined(__mips__) 236# define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 40) 237#elif defined(__aarch64__) 238# define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 48) 239#else 240# define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47) 241#endif 242 243// The AArch64 linux port uses the canonical syscall set as mandated by 244// the upstream linux community for all new ports. Other ports may still 245// use legacy syscalls. 246#ifndef SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 247# if defined(__aarch64__) && SANITIZER_LINUX 248# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 1 249# else 250# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 0 251# endif 252#endif 253 254// udi16 syscalls can only be used when the following conditions are 255// met: 256// * target is one of arm32, x86-32, sparc32, sh or m68k 257// * libc version is libc5, glibc-2.0, glibc-2.1 or glibc-2.2 to 2.15 258// built against > linux-2.2 kernel headers 259// Since we don't want to include libc headers here, we check the 260// target only. 261#if defined(__arm__) || SANITIZER_X32 || defined(__sparc__) 262#define SANITIZER_USES_UID16_SYSCALLS 1 263#else 264#define SANITIZER_USES_UID16_SYSCALLS 0 265#endif 266 267#if defined(__mips__) 268# define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 10) 269#else 270# define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 12) 271#endif 272 273// Assume obsolete RPC headers are available by default 274#if !defined(HAVE_RPC_XDR_H) && !defined(HAVE_TIRPC_RPC_XDR_H) 275# define HAVE_RPC_XDR_H (SANITIZER_LINUX && !SANITIZER_ANDROID) 276# define HAVE_TIRPC_RPC_XDR_H 0 277#endif 278 279/// \macro MSC_PREREQ 280/// \brief Is the compiler MSVC of at least the specified version? 281/// The common \param version values to check for are: 282/// * 1800: Microsoft Visual Studio 2013 / 12.0 283/// * 1900: Microsoft Visual Studio 2015 / 14.0 284#ifdef _MSC_VER 285# define MSC_PREREQ(version) (_MSC_VER >= (version)) 286#else 287# define MSC_PREREQ(version) 0 288#endif 289 290#if defined(__arm64__) && SANITIZER_IOS 291# define SANITIZER_NON_UNIQUE_TYPEINFO 1 292#else 293# define SANITIZER_NON_UNIQUE_TYPEINFO 0 294#endif 295 296// On linux, some architectures had an ABI transition from 64-bit long double 297// (ie. same as double) to 128-bit long double. On those, glibc symbols 298// involving long doubles come in two versions, and we need to pass the 299// correct one to dlvsym when intercepting them. 300#if SANITIZER_LINUX && (SANITIZER_S390 || SANITIZER_PPC32 || SANITIZER_PPC64V1) 301#define SANITIZER_NLDBL_VERSION "GLIBC_2.4" 302#endif 303 304#if SANITIZER_GO == 0 305# define SANITIZER_GO 0 306#endif 307 308// On PowerPC and ARM Thumb, calling pthread_exit() causes LSan to detect leaks. 309// pthread_exit() performs unwinding that leads to dlopen'ing libgcc_s.so. 310// dlopen mallocs "libgcc_s.so" string which confuses LSan, it fails to realize 311// that this allocation happens in dynamic linker and should be ignored. 312#if SANITIZER_PPC || defined(__thumb__) 313# define SANITIZER_SUPPRESS_LEAK_ON_PTHREAD_EXIT 1 314#else 315# define SANITIZER_SUPPRESS_LEAK_ON_PTHREAD_EXIT 0 316#endif 317 318#if SANITIZER_FREEBSD || SANITIZER_MAC || SANITIZER_NETBSD || \ 319 SANITIZER_OPENBSD || SANITIZER_SOLARIS 320# define SANITIZER_MADVISE_DONTNEED MADV_FREE 321#else 322# define SANITIZER_MADVISE_DONTNEED MADV_DONTNEED 323#endif 324 325// Older gcc have issues aligning to a constexpr, and require an integer. 326// See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56859 among others. 327#if defined(__powerpc__) || defined(__powerpc64__) 328# define SANITIZER_CACHE_LINE_SIZE 128 329#else 330# define SANITIZER_CACHE_LINE_SIZE 64 331#endif 332 333// Enable offline markup symbolizer for Fuchsia and RTEMS. 334#if SANITIZER_FUCHSIA || SANITIZER_RTEMS 335#define SANITIZER_SYMBOLIZER_MARKUP 1 336#else 337#define SANITIZER_SYMBOLIZER_MARKUP 0 338#endif 339 340#endif // SANITIZER_PLATFORM_H 341