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