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