sanitizer_platform.h revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===-- sanitizer_platform.h ------------------------------------*- C++ -*-===//
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// License. See LICENSE.TXT for details.
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//===----------------------------------------------------------------------===//
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Common platform macros.
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===//
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#ifndef SANITIZER_PLATFORM_H
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SANITIZER_PLATFORM_H
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(__linux__) && !defined(__FreeBSD__) && \
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  !defined(__APPLE__) && !defined(_WIN32)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# error "This operating system is not supported"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(__linux__)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_LINUX   1
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_LINUX   0
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if defined(__FreeBSD__)
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_FREEBSD 1
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#else
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_FREEBSD 0
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(__APPLE__)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_MAC     1
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# include <TargetConditionals.h>
36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# if TARGET_OS_IPHONE
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#  define SANITIZER_IOS    1
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# else
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#  define SANITIZER_IOS    0
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# endif
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_MAC     0
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_IOS     0
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(_WIN32)
47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_WINDOWS 1
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_WINDOWS 0
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if defined(__ANDROID__) || defined(ANDROID)
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_ANDROID 1
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#else
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)# define SANITIZER_ANDROID 0
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define SANITIZER_POSIX (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_MAC)
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if __LP64__ || defined(_WIN64)
61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#  define SANITIZER_WORDSIZE 64
62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#else
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#  define SANITIZER_WORDSIZE 32
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if SANITIZER_WORDSIZE == 64
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define FIRST_32_SECOND_64(a, b) (b)
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#else
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define FIRST_32_SECOND_64(a, b) (a)
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if defined(__x86_64__) && !defined(_LP64)
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_X32 1
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#else
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)# define SANITIZER_X32 0
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// By default we allow to use SizeClassAllocator64 on 64-bit platform.
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// But in some cases (e.g. AArch64's 39-bit address space) SizeClassAllocator64
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// does not work well and we need to fallback to SizeClassAllocator32.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// For such platforms build this code with -DSANITIZER_CAN_USE_ALLOCATOR64=0 or
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// change the definition of SANITIZER_CAN_USE_ALLOCATOR64 here.
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef SANITIZER_CAN_USE_ALLOCATOR64
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# if defined(__aarch64__)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#  define SANITIZER_CAN_USE_ALLOCATOR64 0
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# else
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#  define SANITIZER_CAN_USE_ALLOCATOR64 (SANITIZER_WORDSIZE == 64)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# endif
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The range of addresses which can be returned my mmap.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// FIXME: this value should be different on different platforms,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// e.g. on AArch64 it is most likely (1ULL << 39). Larger values will still work
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// but will consume more memory for TwoLevelByteMap.
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(__aarch64__)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 39)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47)
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// The AArch64 linux port uses the canonical syscall set as mandated by
102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// the upstream linux community for all new ports. Other ports may still
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// use legacy syscalls.
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#ifndef SANITIZER_USES_CANONICAL_LINUX_SYSCALLS
105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# if defined(__aarch64__) && SANITIZER_LINUX
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 1
107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# else
108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 0
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# endif
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // SANITIZER_PLATFORM_H
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)