blob: d2f1d5de4267dbf7899858852edae3dbef346144 [file] [log] [blame]
george.karpenkov29efa6d2017-08-21 23:25:50 +00001//===- FuzzerUtil.h - Internal header for the Fuzzer Utils ------*- 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// Util functions.
10//===----------------------------------------------------------------------===//
11
12#ifndef LLVM_FUZZER_UTIL_H
13#define LLVM_FUZZER_UTIL_H
14
metzman40132972019-01-09 21:46:09 +000015#include "FuzzerBuiltins.h"
16#include "FuzzerBuiltinsMsvc.h"
morehousea80f6452017-12-04 19:25:59 +000017#include "FuzzerCommand.h"
metzman40132972019-01-09 21:46:09 +000018#include "FuzzerDefs.h"
george.karpenkov29efa6d2017-08-21 23:25:50 +000019
20namespace fuzzer {
21
22void PrintHexArray(const Unit &U, const char *PrintAfter = "");
23
24void PrintHexArray(const uint8_t *Data, size_t Size,
25 const char *PrintAfter = "");
26
27void PrintASCII(const uint8_t *Data, size_t Size, const char *PrintAfter = "");
28
29void PrintASCII(const Unit &U, const char *PrintAfter = "");
30
31// Changes U to contain only ASCII (isprint+isspace) characters.
32// Returns true iff U has been changed.
33bool ToASCII(uint8_t *Data, size_t Size);
34
35bool IsASCII(const Unit &U);
36
37bool IsASCII(const uint8_t *Data, size_t Size);
38
39std::string Base64(const Unit &U);
40
41void PrintPC(const char *SymbolizedFMT, const char *FallbackFMT, uintptr_t PC);
42
43std::string DescribePC(const char *SymbolizedFMT, uintptr_t PC);
44
morehousebd67cc22018-05-08 23:45:05 +000045void PrintStackTrace();
46
47void PrintMemoryProfile();
48
george.karpenkov29efa6d2017-08-21 23:25:50 +000049unsigned NumberOfCpuCores();
50
51// Platform specific functions.
52void SetSignalHandler(const FuzzingOptions& Options);
53
54void SleepSeconds(int Seconds);
55
56unsigned long GetPid();
57
58size_t GetPeakRSSMb();
59
morehousea80f6452017-12-04 19:25:59 +000060int ExecuteCommand(const Command &Cmd);
george.karpenkov29efa6d2017-08-21 23:25:50 +000061
62FILE *OpenProcessPipe(const char *Command, const char *Mode);
63
64const void *SearchMemory(const void *haystack, size_t haystacklen,
65 const void *needle, size_t needlelen);
66
george.karpenkovfbfa45c2017-08-27 23:20:09 +000067std::string CloneArgsWithoutX(const Vector<std::string> &Args,
george.karpenkov29efa6d2017-08-21 23:25:50 +000068 const char *X1, const char *X2);
69
george.karpenkovfbfa45c2017-08-27 23:20:09 +000070inline std::string CloneArgsWithoutX(const Vector<std::string> &Args,
george.karpenkov29efa6d2017-08-21 23:25:50 +000071 const char *X) {
72 return CloneArgsWithoutX(Args, X, X);
73}
74
75inline std::pair<std::string, std::string> SplitBefore(std::string X,
76 std::string S) {
77 auto Pos = S.find(X);
78 if (Pos == std::string::npos)
79 return std::make_pair(S, "");
80 return std::make_pair(S.substr(0, Pos), S.substr(Pos));
81}
82
83std::string DisassembleCmd(const std::string &FileName);
84
85std::string SearchRegexCmd(const std::string &Regex);
86
87size_t SimpleFastHash(const uint8_t *Data, size_t Size);
88
metzman40132972019-01-09 21:46:09 +000089inline uint32_t Log(uint32_t X) { return 32 - Clz(X) - 1; }
kcce29d7e32017-12-12 23:11:28 +000090
george.karpenkov29efa6d2017-08-21 23:25:50 +000091} // namespace fuzzer
92
93#endif // LLVM_FUZZER_UTIL_H