blob: 89d675ac1a44189580842578197cdb3c960566f1 [file] [log] [blame]
Kostya Serebryany6f5a8042016-09-21 01:50:50 +00001//===- FuzzerDefs.h - Internal header for the Fuzzer ------------*- 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// Basic definitions.
10//===----------------------------------------------------------------------===//
11#ifndef LLVM_FUZZER_DEFS_H
12#define LLVM_FUZZER_DEFS_H
13
Kostya Serebryany556894f2016-09-21 02:05:39 +000014#include <cassert>
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000015#include <cstddef>
16#include <cstdint>
Kostya Serebryany86586182016-09-21 21:17:23 +000017#include <cstring>
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000018#include <string>
19#include <vector>
20
21// Platform detection.
22#ifdef __linux__
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000023#define LIBFUZZER_APPLE 0
Zachary Turnerc6d8b4c2016-11-30 16:32:54 +000024#define LIBFUZZER_LINUX 1
25#define LIBFUZZER_WINDOWS 0
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000026#elif __APPLE__
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000027#define LIBFUZZER_APPLE 1
Zachary Turnerc6d8b4c2016-11-30 16:32:54 +000028#define LIBFUZZER_LINUX 0
29#define LIBFUZZER_WINDOWS 0
30#elif _WIN32
31#define LIBFUZZER_APPLE 0
32#define LIBFUZZER_LINUX 0
33#define LIBFUZZER_WINDOWS 1
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000034#else
35#error "Support for your platform has not been implemented"
36#endif
37
Zachary Turnerc6d8b4c2016-11-30 16:32:54 +000038#define LIBFUZZER_POSIX LIBFUZZER_APPLE || LIBFUZZER_LINUX
39
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000040#ifdef __x86_64
41#define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt")))
42#else
43#define ATTRIBUTE_TARGET_POPCNT
44#endif
45
46namespace fuzzer {
47
Kostya Serebryanyd28099d2016-09-23 00:22:46 +000048template <class T> T Min(T a, T b) { return a < b ? a : b; }
49template <class T> T Max(T a, T b) { return a > b ? a : b; }
50
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000051class Random;
52class Dictionary;
53class DictionaryEntry;
54class MutationDispatcher;
Kostya Serebryany556894f2016-09-21 02:05:39 +000055struct FuzzingOptions;
56class InputCorpus;
Kostya Serebryany29bb6642016-09-21 22:42:17 +000057struct InputInfo;
Kostya Serebryany556894f2016-09-21 02:05:39 +000058struct ExternalFunctions;
59
60// Global interface to functions that may or may not be available.
61extern ExternalFunctions *EF;
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000062
63typedef std::vector<uint8_t> Unit;
64typedef std::vector<Unit> UnitVector;
65typedef int (*UserCallback)(const uint8_t *Data, size_t Size);
Zachary Turner24a148b2016-11-30 19:06:14 +000066
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000067int FuzzerDriver(int *argc, char ***argv, UserCallback Callback);
68
Kostya Serebryanya5f94fb2016-10-14 20:20:33 +000069struct ScopedDoingMyOwnMemmem {
70 ScopedDoingMyOwnMemmem();
71 ~ScopedDoingMyOwnMemmem();
72};
73
Kostya Serebryany9a4b10a2016-10-15 04:00:07 +000074inline uint8_t Bswap(uint8_t x) { return x; }
75inline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); }
76inline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); }
77inline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); }
78
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000079} // namespace fuzzer
80#endif // LLVM_FUZZER_DEFS_H