1 //===- FuzzerDefs.h - Internal header for the Fuzzer ------------*- C++ -* ===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 //===----------------------------------------------------------------------===//
12 #ifndef LLVM_FUZZER_DEFS_H
13 #define LLVM_FUZZER_DEFS_H
22 // Platform detection.
24 #define LIBFUZZER_APPLE 0
25 #define LIBFUZZER_LINUX 1
26 #define LIBFUZZER_WINDOWS 0
28 #define LIBFUZZER_APPLE 1
29 #define LIBFUZZER_LINUX 0
30 #define LIBFUZZER_WINDOWS 0
32 #define LIBFUZZER_APPLE 0
33 #define LIBFUZZER_LINUX 0
34 #define LIBFUZZER_WINDOWS 1
36 #error "Support for your platform has not been implemented"
39 #ifndef __has_attribute
40 # define __has_attribute(x) 0
43 #define LIBFUZZER_POSIX LIBFUZZER_APPLE || LIBFUZZER_LINUX
46 # if __has_attribute(target)
47 # define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt")))
49 # define ATTRIBUTE_TARGET_POPCNT
52 # define ATTRIBUTE_TARGET_POPCNT
56 #ifdef __clang__ // avoid gcc warning.
57 # define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
58 # define ALWAYS_INLINE __attribute__((always_inline))
60 # define ATTRIBUTE_NO_SANITIZE_MEMORY
61 # define ALWAYS_INLINE
64 #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
66 #if defined(__has_feature)
67 # if __has_feature(address_sanitizer)
68 # define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS
69 # elif __has_feature(memory_sanitizer)
70 # define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY
72 # define ATTRIBUTE_NO_SANITIZE_ALL
75 # define ATTRIBUTE_NO_SANITIZE_ALL
79 #define ATTRIBUTE_INTERFACE __declspec(dllexport)
81 #define ATTRIBUTE_INTERFACE __attribute__((visibility("default")))
86 template <class T> T Min(T a, T b) { return a < b ? a : b; }
87 template <class T> T Max(T a, T b) { return a > b ? a : b; }
91 class DictionaryEntry;
92 class MutationDispatcher;
93 struct FuzzingOptions;
96 struct ExternalFunctions;
98 // Global interface to functions that may or may not be available.
99 extern ExternalFunctions *EF;
101 typedef std::vector<uint8_t> Unit;
102 typedef std::vector<Unit> UnitVector;
103 typedef int (*UserCallback)(const uint8_t *Data, size_t Size);
105 int FuzzerDriver(int *argc, char ***argv, UserCallback Callback);
107 struct ScopedDoingMyOwnMemOrStr {
108 ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr++; }
109 ~ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr--; }
110 static int DoingMyOwnMemOrStr;
113 inline uint8_t Bswap(uint8_t x) { return x; }
114 inline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); }
115 inline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); }
116 inline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); }
118 uint8_t *ExtraCountersBegin();
119 uint8_t *ExtraCountersEnd();
120 void ClearExtraCounters();
122 } // namespace fuzzer
124 #endif // LLVM_FUZZER_DEFS_H