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