mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
03329c2c8b
In an effort to get libfuzzer working on Windows, we need to make a distinction between what functions require platform specific code (e.g. different code on Windows vs Linux) and what code doesn't. IO functions, for example, tend to be platform specific. This patch separates out some of the functions which will need to have platform specific implementations into different headers, so that we can then provide different implementations for each platform. Aside from that, this patch contains no functional change. It is purely a re-organization. Patch by Marcos Pividori Differential Revision: https://reviews.llvm.org/D27230 llvm-svn: 288264
81 lines
2.1 KiB
C++
81 lines
2.1 KiB
C++
//===- FuzzerDefs.h - Internal header for the Fuzzer ------------*- C++ -* ===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
// Basic definitions.
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef LLVM_FUZZER_DEFS_H
|
|
#define LLVM_FUZZER_DEFS_H
|
|
|
|
#include <cassert>
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
// Platform detection.
|
|
#ifdef __linux__
|
|
#define LIBFUZZER_APPLE 0
|
|
#define LIBFUZZER_LINUX 1
|
|
#define LIBFUZZER_WINDOWS 0
|
|
#elif __APPLE__
|
|
#define LIBFUZZER_APPLE 1
|
|
#define LIBFUZZER_LINUX 0
|
|
#define LIBFUZZER_WINDOWS 0
|
|
#elif _WIN32
|
|
#define LIBFUZZER_APPLE 0
|
|
#define LIBFUZZER_LINUX 0
|
|
#define LIBFUZZER_WINDOWS 1
|
|
#else
|
|
#error "Support for your platform has not been implemented"
|
|
#endif
|
|
|
|
#define LIBFUZZER_POSIX LIBFUZZER_APPLE || LIBFUZZER_LINUX
|
|
|
|
#ifdef __x86_64
|
|
#define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt")))
|
|
#else
|
|
#define ATTRIBUTE_TARGET_POPCNT
|
|
#endif
|
|
|
|
namespace fuzzer {
|
|
|
|
template <class T> T Min(T a, T b) { return a < b ? a : b; }
|
|
template <class T> T Max(T a, T b) { return a > b ? a : b; }
|
|
|
|
class Random;
|
|
class Dictionary;
|
|
class DictionaryEntry;
|
|
class MutationDispatcher;
|
|
struct FuzzingOptions;
|
|
class InputCorpus;
|
|
struct InputInfo;
|
|
struct ExternalFunctions;
|
|
|
|
// Global interface to functions that may or may not be available.
|
|
extern ExternalFunctions *EF;
|
|
|
|
typedef std::vector<uint8_t> Unit;
|
|
typedef std::vector<Unit> UnitVector;
|
|
typedef int (*UserCallback)(const uint8_t *Data, size_t Size);
|
|
|
|
int FuzzerDriver(int *argc, char ***argv, UserCallback Callback);
|
|
|
|
struct ScopedDoingMyOwnMemmem {
|
|
ScopedDoingMyOwnMemmem();
|
|
~ScopedDoingMyOwnMemmem();
|
|
};
|
|
|
|
inline uint8_t Bswap(uint8_t x) { return x; }
|
|
inline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); }
|
|
inline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); }
|
|
inline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); }
|
|
|
|
} // namespace fuzzer
|
|
#endif // LLVM_FUZZER_DEFS_H
|