124e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov//===-- sanitizer_platform.h ------------------------------------*- C++ -*-===// 224e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov// 324e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov// The LLVM Compiler Infrastructure 424e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov// 524e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov// This file is distributed under the University of Illinois Open Source 624e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov// License. See LICENSE.TXT for details. 724e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov// 824e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov//===----------------------------------------------------------------------===// 924e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov// 1024e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov// Common platform macros. 1124e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov//===----------------------------------------------------------------------===// 1224e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov 1324e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#ifndef SANITIZER_PLATFORM_H 1424e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#define SANITIZER_PLATFORM_H 1524e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if !defined(__linux__) && !defined(__FreeBSD__) && \ 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines !defined(__APPLE__) && !defined(_WIN32) 1824e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov# error "This operating system is not supported" 1924e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#endif 2024e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov 2124e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#if defined(__linux__) 2224e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov# define SANITIZER_LINUX 1 2324e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#else 2424e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov# define SANITIZER_LINUX 0 2524e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#endif 2624e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov 272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if defined(__FreeBSD__) 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define SANITIZER_FREEBSD 1 292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define SANITIZER_FREEBSD 0 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3324e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#if defined(__APPLE__) 3424e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov# define SANITIZER_MAC 1 35b8a141f3783d796eabf45fabff82f3e08244e338Alexander Potapenko# include <TargetConditionals.h> 36b8a141f3783d796eabf45fabff82f3e08244e338Alexander Potapenko# if TARGET_OS_IPHONE 37b8a141f3783d796eabf45fabff82f3e08244e338Alexander Potapenko# define SANITIZER_IOS 1 38b8a141f3783d796eabf45fabff82f3e08244e338Alexander Potapenko# else 39b8a141f3783d796eabf45fabff82f3e08244e338Alexander Potapenko# define SANITIZER_IOS 0 40b8a141f3783d796eabf45fabff82f3e08244e338Alexander Potapenko# endif 413d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# if TARGET_IPHONE_SIMULATOR 423d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define SANITIZER_IOSSIM 1 433d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# else 443d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define SANITIZER_IOSSIM 0 453d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# endif 4624e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#else 4724e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov# define SANITIZER_MAC 0 48b8a141f3783d796eabf45fabff82f3e08244e338Alexander Potapenko# define SANITIZER_IOS 0 493d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define SANITIZER_IOSSIM 0 5024e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#endif 5124e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov 5224e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#if defined(_WIN32) 5324e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov# define SANITIZER_WINDOWS 1 5424e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#else 5524e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov# define SANITIZER_WINDOWS 0 5624e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#endif 5724e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov 58b625a87696a619962e3b62804b0b42d8d6f31f29Dan Albert#if defined(__ANDROID__) 5924e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov# define SANITIZER_ANDROID 1 6024e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#else 6124e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov# define SANITIZER_ANDROID 0 6224e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#endif 6324e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov 642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define SANITIZER_POSIX (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_MAC) 652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if __LP64__ || defined(_WIN64) 672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define SANITIZER_WORDSIZE 64 682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define SANITIZER_WORDSIZE 32 702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if SANITIZER_WORDSIZE == 64 732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define FIRST_32_SECOND_64(a, b) (b) 742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define FIRST_32_SECOND_64(a, b) (a) 762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if defined(__x86_64__) && !defined(_LP64) 792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define SANITIZER_X32 1 802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define SANITIZER_X32 0 822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// By default we allow to use SizeClassAllocator64 on 64-bit platform. 852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// But in some cases (e.g. AArch64's 39-bit address space) SizeClassAllocator64 862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// does not work well and we need to fallback to SizeClassAllocator32. 872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// For such platforms build this code with -DSANITIZER_CAN_USE_ALLOCATOR64=0 or 882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// change the definition of SANITIZER_CAN_USE_ALLOCATOR64 here. 892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifndef SANITIZER_CAN_USE_ALLOCATOR64 903d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# if defined(__mips64) || defined(__aarch64__) 912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define SANITIZER_CAN_USE_ALLOCATOR64 0 922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# else 932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define SANITIZER_CAN_USE_ALLOCATOR64 (SANITIZER_WORDSIZE == 64) 942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# endif 952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// The range of addresses which can be returned my mmap. 983d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// FIXME: this value should be different on different platforms. Larger values 993d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// will still work but will consume more memory for TwoLevelByteMap. 1003d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#if defined(__mips__) 1016d1862363c88c183b0ed7740fca876342cf0474bStephen Hines# define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 40) 1022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 1032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47) 1042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 1052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// The AArch64 linux port uses the canonical syscall set as mandated by 1072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// the upstream linux community for all new ports. Other ports may still 1082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// use legacy syscalls. 1092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifndef SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 1102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# if defined(__aarch64__) && SANITIZER_LINUX 1112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 1 1122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# else 1132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 0 1142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# endif 1152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 11624e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov 11786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// udi16 syscalls can only be used when the following conditions are 11886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// met: 11986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// * target is one of arm32, x86-32, sparc32, sh or m68k 12086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// * libc version is libc5, glibc-2.0, glibc-2.1 or glibc-2.2 to 2.15 12186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// built against > linux-2.2 kernel headers 12286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// Since we don't want to include libc headers here, we check the 12386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// target only. 12486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if defined(__arm__) || SANITIZER_X32 || defined(__sparc__) 12586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define SANITIZER_USES_UID16_SYSCALLS 1 12686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#else 12786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define SANITIZER_USES_UID16_SYSCALLS 0 12886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 12986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 1303d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#if defined(__mips__) 1316d1862363c88c183b0ed7740fca876342cf0474bStephen Hines# define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 10) 1326d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#else 1336d1862363c88c183b0ed7740fca876342cf0474bStephen Hines# define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 12) 1346d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#endif 1356d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 136259f7063e3e4c4b94dded1e90ab0a943d0fa737bPirama Arumuga Nainar// Assume obsolete RPC headers are available by default 137259f7063e3e4c4b94dded1e90ab0a943d0fa737bPirama Arumuga Nainar#if !defined(HAVE_RPC_XDR_H) && !defined(HAVE_TIRPC_RPC_XDR_H) 138259f7063e3e4c4b94dded1e90ab0a943d0fa737bPirama Arumuga Nainar# define HAVE_RPC_XDR_H (SANITIZER_LINUX && !SANITIZER_ANDROID) 139259f7063e3e4c4b94dded1e90ab0a943d0fa737bPirama Arumuga Nainar# define HAVE_TIRPC_RPC_XDR_H 0 140259f7063e3e4c4b94dded1e90ab0a943d0fa737bPirama Arumuga Nainar#endif 141259f7063e3e4c4b94dded1e90ab0a943d0fa737bPirama Arumuga Nainar 1423d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar/// \macro MSC_PREREQ 1433d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar/// \brief Is the compiler MSVC of at least the specified version? 1443d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar/// The common \param version values to check for are: 1453d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar/// * 1800: Microsoft Visual Studio 2013 / 12.0 1463d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar/// * 1900: Microsoft Visual Studio 2015 / 14.0 1473d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef _MSC_VER 1483d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define MSC_PREREQ(version) (_MSC_VER >= (version)) 1493d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 1503d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define MSC_PREREQ(version) 0 1513d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 1523d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 15324e13723f8477d8c42ab8b2a7f4f69fc089842f1Evgeniy Stepanov#endif // SANITIZER_PLATFORM_H 154