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__) && \
17  !defined(__APPLE__) && !defined(_WIN32)
18# error "This operating system is not supported"
19#endif
20
21#if defined(__linux__)
22# define SANITIZER_LINUX   1
23#else
24# define SANITIZER_LINUX   0
25#endif
26
27#if defined(__FreeBSD__)
28# define SANITIZER_FREEBSD 1
29#else
30# define SANITIZER_FREEBSD 0
31#endif
32
33#if defined(__APPLE__)
34# define SANITIZER_MAC     1
35# include <TargetConditionals.h>
36# if TARGET_OS_IPHONE
37#  define SANITIZER_IOS    1
38# else
39#  define SANITIZER_IOS    0
40# endif
41#else
42# define SANITIZER_MAC     0
43# define SANITIZER_IOS     0
44#endif
45
46#if defined(_WIN32)
47# define SANITIZER_WINDOWS 1
48#else
49# define SANITIZER_WINDOWS 0
50#endif
51
52#if defined(__ANDROID__) || defined(ANDROID)
53# define SANITIZER_ANDROID 1
54#else
55# define SANITIZER_ANDROID 0
56#endif
57
58#define SANITIZER_POSIX (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_MAC)
59
60#if __LP64__ || defined(_WIN64)
61#  define SANITIZER_WORDSIZE 64
62#else
63#  define SANITIZER_WORDSIZE 32
64#endif
65
66#if SANITIZER_WORDSIZE == 64
67# define FIRST_32_SECOND_64(a, b) (b)
68#else
69# define FIRST_32_SECOND_64(a, b) (a)
70#endif
71
72#if defined(__x86_64__) && !defined(_LP64)
73# define SANITIZER_X32 1
74#else
75# define SANITIZER_X32 0
76#endif
77
78// By default we allow to use SizeClassAllocator64 on 64-bit platform.
79// But in some cases (e.g. AArch64's 39-bit address space) SizeClassAllocator64
80// does not work well and we need to fallback to SizeClassAllocator32.
81// For such platforms build this code with -DSANITIZER_CAN_USE_ALLOCATOR64=0 or
82// change the definition of SANITIZER_CAN_USE_ALLOCATOR64 here.
83#ifndef SANITIZER_CAN_USE_ALLOCATOR64
84# if defined(__aarch64__)
85#  define SANITIZER_CAN_USE_ALLOCATOR64 0
86# else
87#  define SANITIZER_CAN_USE_ALLOCATOR64 (SANITIZER_WORDSIZE == 64)
88# endif
89#endif
90
91// The range of addresses which can be returned my mmap.
92// FIXME: this value should be different on different platforms,
93// e.g. on AArch64 it is most likely (1ULL << 39). Larger values will still work
94// but will consume more memory for TwoLevelByteMap.
95#if defined(__aarch64__)
96# define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 39)
97#else
98# define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47)
99#endif
100
101// The AArch64 linux port uses the canonical syscall set as mandated by
102// the upstream linux community for all new ports. Other ports may still
103// use legacy syscalls.
104#ifndef SANITIZER_USES_CANONICAL_LINUX_SYSCALLS
105# if defined(__aarch64__) && SANITIZER_LINUX
106# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 1
107# else
108# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 0
109# endif
110#endif
111
112#endif // SANITIZER_PLATFORM_H
113