]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/fuzzer/FuzzerDefs.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / fuzzer / FuzzerDefs.h
1 //===- FuzzerDefs.h - Internal header for the Fuzzer ------------*- C++ -* ===//
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 // Basic definitions.
9 //===----------------------------------------------------------------------===//
10
11 #ifndef LLVM_FUZZER_DEFS_H
12 #define LLVM_FUZZER_DEFS_H
13
14 #include <cassert>
15 #include <cstddef>
16 #include <cstdint>
17 #include <cstring>
18 #include <string>
19 #include <vector>
20 #include <set>
21 #include <memory>
22
23 // Platform detection.
24 #ifdef __linux__
25 #define LIBFUZZER_APPLE 0
26 #define LIBFUZZER_FUCHSIA 0
27 #define LIBFUZZER_LINUX 1
28 #define LIBFUZZER_NETBSD 0
29 #define LIBFUZZER_FREEBSD 0
30 #define LIBFUZZER_OPENBSD 0
31 #define LIBFUZZER_WINDOWS 0
32 #elif __APPLE__
33 #define LIBFUZZER_APPLE 1
34 #define LIBFUZZER_FUCHSIA 0
35 #define LIBFUZZER_LINUX 0
36 #define LIBFUZZER_NETBSD 0
37 #define LIBFUZZER_FREEBSD 0
38 #define LIBFUZZER_OPENBSD 0
39 #define LIBFUZZER_WINDOWS 0
40 #elif __NetBSD__
41 #define LIBFUZZER_APPLE 0
42 #define LIBFUZZER_FUCHSIA 0
43 #define LIBFUZZER_LINUX 0
44 #define LIBFUZZER_NETBSD 1
45 #define LIBFUZZER_FREEBSD 0
46 #define LIBFUZZER_OPENBSD 0
47 #define LIBFUZZER_WINDOWS 0
48 #elif __FreeBSD__
49 #define LIBFUZZER_APPLE 0
50 #define LIBFUZZER_FUCHSIA 0
51 #define LIBFUZZER_LINUX 0
52 #define LIBFUZZER_NETBSD 0
53 #define LIBFUZZER_FREEBSD 1
54 #define LIBFUZZER_OPENBSD 0
55 #define LIBFUZZER_WINDOWS 0
56 #elif __OpenBSD__
57 #define LIBFUZZER_APPLE 0
58 #define LIBFUZZER_FUCHSIA 0
59 #define LIBFUZZER_LINUX 0
60 #define LIBFUZZER_NETBSD 0
61 #define LIBFUZZER_FREEBSD 0
62 #define LIBFUZZER_OPENBSD 1
63 #define LIBFUZZER_WINDOWS 0
64 #elif _WIN32
65 #define LIBFUZZER_APPLE 0
66 #define LIBFUZZER_FUCHSIA 0
67 #define LIBFUZZER_LINUX 0
68 #define LIBFUZZER_NETBSD 0
69 #define LIBFUZZER_FREEBSD 0
70 #define LIBFUZZER_OPENBSD 0
71 #define LIBFUZZER_WINDOWS 1
72 #elif __Fuchsia__
73 #define LIBFUZZER_APPLE 0
74 #define LIBFUZZER_FUCHSIA 1
75 #define LIBFUZZER_LINUX 0
76 #define LIBFUZZER_NETBSD 0
77 #define LIBFUZZER_FREEBSD 0
78 #define LIBFUZZER_OPENBSD 0
79 #define LIBFUZZER_WINDOWS 0
80 #else
81 #error "Support for your platform has not been implemented"
82 #endif
83
84 #if defined(_MSC_VER) && !defined(__clang__)
85 // MSVC compiler is being used.
86 #define LIBFUZZER_MSVC 1
87 #else
88 #define LIBFUZZER_MSVC 0
89 #endif
90
91 #ifndef __has_attribute
92 #  define __has_attribute(x) 0
93 #endif
94
95 #define LIBFUZZER_POSIX                                                        \
96   (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD ||                   \
97    LIBFUZZER_FREEBSD || LIBFUZZER_OPENBSD)
98
99 #ifdef __x86_64
100 #  if __has_attribute(target)
101 #    define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt")))
102 #  else
103 #    define ATTRIBUTE_TARGET_POPCNT
104 #  endif
105 #else
106 #  define ATTRIBUTE_TARGET_POPCNT
107 #endif
108
109
110 #ifdef __clang__  // avoid gcc warning.
111 #  if __has_attribute(no_sanitize)
112 #    define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
113 #  else
114 #    define ATTRIBUTE_NO_SANITIZE_MEMORY
115 #  endif
116 #  define ALWAYS_INLINE __attribute__((always_inline))
117 #else
118 #  define ATTRIBUTE_NO_SANITIZE_MEMORY
119 #  define ALWAYS_INLINE
120 #endif // __clang__
121
122 #if LIBFUZZER_WINDOWS
123 #define ATTRIBUTE_NO_SANITIZE_ADDRESS
124 #else
125 #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
126 #endif
127
128 #if LIBFUZZER_WINDOWS
129 #define ATTRIBUTE_ALIGNED(X) __declspec(align(X))
130 #define ATTRIBUTE_INTERFACE __declspec(dllexport)
131 // This is used for __sancov_lowest_stack which is needed for
132 // -fsanitize-coverage=stack-depth. That feature is not yet available on
133 // Windows, so make the symbol static to avoid linking errors.
134 #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC static
135 #define ATTRIBUTE_NOINLINE __declspec(noinline)
136 #else
137 #define ATTRIBUTE_ALIGNED(X) __attribute__((aligned(X)))
138 #define ATTRIBUTE_INTERFACE __attribute__((visibility("default")))
139 #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC \
140   ATTRIBUTE_INTERFACE __attribute__((tls_model("initial-exec"))) thread_local
141
142 #define ATTRIBUTE_NOINLINE __attribute__((noinline))
143 #endif
144
145 #if defined(__has_feature)
146 #  if __has_feature(address_sanitizer)
147 #    define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS
148 #  elif __has_feature(memory_sanitizer)
149 #    define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY
150 #  else
151 #    define ATTRIBUTE_NO_SANITIZE_ALL
152 #  endif
153 #else
154 #  define ATTRIBUTE_NO_SANITIZE_ALL
155 #endif
156
157 namespace fuzzer {
158
159 template <class T> T Min(T a, T b) { return a < b ? a : b; }
160 template <class T> T Max(T a, T b) { return a > b ? a : b; }
161
162 class Random;
163 class Dictionary;
164 class DictionaryEntry;
165 class MutationDispatcher;
166 struct FuzzingOptions;
167 class InputCorpus;
168 struct InputInfo;
169 struct ExternalFunctions;
170
171 // Global interface to functions that may or may not be available.
172 extern ExternalFunctions *EF;
173
174 // We are using a custom allocator to give a different symbol name to STL
175 // containers in order to avoid ODR violations.
176 template<typename T>
177   class fuzzer_allocator: public std::allocator<T> {
178     public:
179       fuzzer_allocator() = default;
180
181       template<class U>
182       fuzzer_allocator(const fuzzer_allocator<U>&) {}
183
184       template<class Other>
185       struct rebind { typedef fuzzer_allocator<Other> other;  };
186   };
187
188 template<typename T>
189 using Vector = std::vector<T, fuzzer_allocator<T>>;
190
191 template<typename T>
192 using Set = std::set<T, std::less<T>, fuzzer_allocator<T>>;
193
194 typedef Vector<uint8_t> Unit;
195 typedef Vector<Unit> UnitVector;
196 typedef int (*UserCallback)(const uint8_t *Data, size_t Size);
197
198 int FuzzerDriver(int *argc, char ***argv, UserCallback Callback);
199
200 uint8_t *ExtraCountersBegin();
201 uint8_t *ExtraCountersEnd();
202 void ClearExtraCounters();
203
204 extern bool RunningUserCallback;
205
206 }  // namespace fuzzer
207
208 #endif  // LLVM_FUZZER_DEFS_H