xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/fuzzer/FuzzerPlatform.h (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
1*5ffd83dbSDimitry Andric //===-- FuzzerPlatform.h --------------------------------------------------===//
2*5ffd83dbSDimitry Andric //
3*5ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*5ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*5ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*5ffd83dbSDimitry Andric //
7*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
8*5ffd83dbSDimitry Andric // Common platform macros.
9*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
10*5ffd83dbSDimitry Andric 
11*5ffd83dbSDimitry Andric #ifndef LLVM_FUZZER_PLATFORM_H
12*5ffd83dbSDimitry Andric #define LLVM_FUZZER_PLATFORM_H
13*5ffd83dbSDimitry Andric 
14*5ffd83dbSDimitry Andric // Platform detection.
15*5ffd83dbSDimitry Andric #ifdef __linux__
16*5ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 0
17*5ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 0
18*5ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 1
19*5ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 0
20*5ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 0
21*5ffd83dbSDimitry Andric #define LIBFUZZER_OPENBSD 0
22*5ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 0
23*5ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 0
24*5ffd83dbSDimitry Andric #elif __APPLE__
25*5ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 1
26*5ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 0
27*5ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 0
28*5ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 0
29*5ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 0
30*5ffd83dbSDimitry Andric #define LIBFUZZER_OPENBSD 0
31*5ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 0
32*5ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 0
33*5ffd83dbSDimitry Andric #elif __NetBSD__
34*5ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 0
35*5ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 0
36*5ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 0
37*5ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 1
38*5ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 0
39*5ffd83dbSDimitry Andric #define LIBFUZZER_OPENBSD 0
40*5ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 0
41*5ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 0
42*5ffd83dbSDimitry Andric #elif __FreeBSD__
43*5ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 0
44*5ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 0
45*5ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 0
46*5ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 0
47*5ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 1
48*5ffd83dbSDimitry Andric #define LIBFUZZER_OPENBSD 0
49*5ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 0
50*5ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 0
51*5ffd83dbSDimitry Andric #elif __OpenBSD__
52*5ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 0
53*5ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 0
54*5ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 0
55*5ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 0
56*5ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 0
57*5ffd83dbSDimitry Andric #define LIBFUZZER_OPENBSD 1
58*5ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 0
59*5ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 0
60*5ffd83dbSDimitry Andric #elif _WIN32
61*5ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 0
62*5ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 0
63*5ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 0
64*5ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 0
65*5ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 0
66*5ffd83dbSDimitry Andric #define LIBFUZZER_OPENBSD 0
67*5ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 1
68*5ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 0
69*5ffd83dbSDimitry Andric #elif __Fuchsia__
70*5ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 0
71*5ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 1
72*5ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 0
73*5ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 0
74*5ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 0
75*5ffd83dbSDimitry Andric #define LIBFUZZER_OPENBSD 0
76*5ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 0
77*5ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 0
78*5ffd83dbSDimitry Andric #elif __EMSCRIPTEN__
79*5ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 0
80*5ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 0
81*5ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 0
82*5ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 0
83*5ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 0
84*5ffd83dbSDimitry Andric #define LIBFUZZER_OPENBSD 0
85*5ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 0
86*5ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 1
87*5ffd83dbSDimitry Andric #else
88*5ffd83dbSDimitry Andric #error "Support for your platform has not been implemented"
89*5ffd83dbSDimitry Andric #endif
90*5ffd83dbSDimitry Andric 
91*5ffd83dbSDimitry Andric #if defined(_MSC_VER) && !defined(__clang__)
92*5ffd83dbSDimitry Andric // MSVC compiler is being used.
93*5ffd83dbSDimitry Andric #define LIBFUZZER_MSVC 1
94*5ffd83dbSDimitry Andric #else
95*5ffd83dbSDimitry Andric #define LIBFUZZER_MSVC 0
96*5ffd83dbSDimitry Andric #endif
97*5ffd83dbSDimitry Andric 
98*5ffd83dbSDimitry Andric #ifndef __has_attribute
99*5ffd83dbSDimitry Andric #define __has_attribute(x) 0
100*5ffd83dbSDimitry Andric #endif
101*5ffd83dbSDimitry Andric 
102*5ffd83dbSDimitry Andric #define LIBFUZZER_POSIX                                                        \
103*5ffd83dbSDimitry Andric   (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD ||                   \
104*5ffd83dbSDimitry Andric    LIBFUZZER_FREEBSD || LIBFUZZER_OPENBSD || LIBFUZZER_EMSCRIPTEN)
105*5ffd83dbSDimitry Andric 
106*5ffd83dbSDimitry Andric #ifdef __x86_64
107*5ffd83dbSDimitry Andric #if __has_attribute(target)
108*5ffd83dbSDimitry Andric #define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt")))
109*5ffd83dbSDimitry Andric #else
110*5ffd83dbSDimitry Andric #define ATTRIBUTE_TARGET_POPCNT
111*5ffd83dbSDimitry Andric #endif
112*5ffd83dbSDimitry Andric #else
113*5ffd83dbSDimitry Andric #define ATTRIBUTE_TARGET_POPCNT
114*5ffd83dbSDimitry Andric #endif
115*5ffd83dbSDimitry Andric 
116*5ffd83dbSDimitry Andric #ifdef __clang__ // avoid gcc warning.
117*5ffd83dbSDimitry Andric #if __has_attribute(no_sanitize)
118*5ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
119*5ffd83dbSDimitry Andric #else
120*5ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_MEMORY
121*5ffd83dbSDimitry Andric #endif
122*5ffd83dbSDimitry Andric #define ALWAYS_INLINE __attribute__((always_inline))
123*5ffd83dbSDimitry Andric #else
124*5ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_MEMORY
125*5ffd83dbSDimitry Andric #define ALWAYS_INLINE
126*5ffd83dbSDimitry Andric #endif // __clang__
127*5ffd83dbSDimitry Andric 
128*5ffd83dbSDimitry Andric #if LIBFUZZER_WINDOWS
129*5ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_ADDRESS
130*5ffd83dbSDimitry Andric #else
131*5ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
132*5ffd83dbSDimitry Andric #endif
133*5ffd83dbSDimitry Andric 
134*5ffd83dbSDimitry Andric #if LIBFUZZER_WINDOWS
135*5ffd83dbSDimitry Andric #define ATTRIBUTE_ALIGNED(X) __declspec(align(X))
136*5ffd83dbSDimitry Andric #define ATTRIBUTE_INTERFACE __declspec(dllexport)
137*5ffd83dbSDimitry Andric // This is used for __sancov_lowest_stack which is needed for
138*5ffd83dbSDimitry Andric // -fsanitize-coverage=stack-depth. That feature is not yet available on
139*5ffd83dbSDimitry Andric // Windows, so make the symbol static to avoid linking errors.
140*5ffd83dbSDimitry Andric #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC static
141*5ffd83dbSDimitry Andric #define ATTRIBUTE_NOINLINE __declspec(noinline)
142*5ffd83dbSDimitry Andric #else
143*5ffd83dbSDimitry Andric #define ATTRIBUTE_ALIGNED(X) __attribute__((aligned(X)))
144*5ffd83dbSDimitry Andric #define ATTRIBUTE_INTERFACE __attribute__((visibility("default")))
145*5ffd83dbSDimitry Andric #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC                                  \
146*5ffd83dbSDimitry Andric   ATTRIBUTE_INTERFACE __attribute__((tls_model("initial-exec"))) thread_local
147*5ffd83dbSDimitry Andric 
148*5ffd83dbSDimitry Andric #define ATTRIBUTE_NOINLINE __attribute__((noinline))
149*5ffd83dbSDimitry Andric #endif
150*5ffd83dbSDimitry Andric 
151*5ffd83dbSDimitry Andric #if defined(__has_feature)
152*5ffd83dbSDimitry Andric #if __has_feature(address_sanitizer)
153*5ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS
154*5ffd83dbSDimitry Andric #elif __has_feature(memory_sanitizer)
155*5ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY
156*5ffd83dbSDimitry Andric #else
157*5ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_ALL
158*5ffd83dbSDimitry Andric #endif
159*5ffd83dbSDimitry Andric #else
160*5ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_ALL
161*5ffd83dbSDimitry Andric #endif
162*5ffd83dbSDimitry Andric 
163*5ffd83dbSDimitry Andric #endif // LLVM_FUZZER_PLATFORM_H
164