13cab2bb3Spatrick //===- FuzzerUtil.h - Internal header for the Fuzzer Utils ------*- C++ -* ===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick // Util functions.
93cab2bb3Spatrick //===----------------------------------------------------------------------===//
103cab2bb3Spatrick
113cab2bb3Spatrick #ifndef LLVM_FUZZER_UTIL_H
123cab2bb3Spatrick #define LLVM_FUZZER_UTIL_H
133cab2bb3Spatrick
143cab2bb3Spatrick #include "FuzzerBuiltins.h"
153cab2bb3Spatrick #include "FuzzerBuiltinsMsvc.h"
163cab2bb3Spatrick #include "FuzzerCommand.h"
173cab2bb3Spatrick #include "FuzzerDefs.h"
183cab2bb3Spatrick
193cab2bb3Spatrick namespace fuzzer {
203cab2bb3Spatrick
213cab2bb3Spatrick void PrintHexArray(const Unit &U, const char *PrintAfter = "");
223cab2bb3Spatrick
233cab2bb3Spatrick void PrintHexArray(const uint8_t *Data, size_t Size,
243cab2bb3Spatrick const char *PrintAfter = "");
253cab2bb3Spatrick
263cab2bb3Spatrick void PrintASCII(const uint8_t *Data, size_t Size, const char *PrintAfter = "");
273cab2bb3Spatrick
283cab2bb3Spatrick void PrintASCII(const Unit &U, const char *PrintAfter = "");
293cab2bb3Spatrick
303cab2bb3Spatrick // Changes U to contain only ASCII (isprint+isspace) characters.
313cab2bb3Spatrick // Returns true iff U has been changed.
323cab2bb3Spatrick bool ToASCII(uint8_t *Data, size_t Size);
333cab2bb3Spatrick
343cab2bb3Spatrick bool IsASCII(const Unit &U);
353cab2bb3Spatrick
363cab2bb3Spatrick bool IsASCII(const uint8_t *Data, size_t Size);
373cab2bb3Spatrick
383cab2bb3Spatrick std::string Base64(const Unit &U);
393cab2bb3Spatrick
403cab2bb3Spatrick void PrintPC(const char *SymbolizedFMT, const char *FallbackFMT, uintptr_t PC);
413cab2bb3Spatrick
423cab2bb3Spatrick std::string DescribePC(const char *SymbolizedFMT, uintptr_t PC);
433cab2bb3Spatrick
443cab2bb3Spatrick void PrintStackTrace();
453cab2bb3Spatrick
463cab2bb3Spatrick void PrintMemoryProfile();
473cab2bb3Spatrick
483cab2bb3Spatrick unsigned NumberOfCpuCores();
493cab2bb3Spatrick
503cab2bb3Spatrick // Platform specific functions.
513cab2bb3Spatrick void SetSignalHandler(const FuzzingOptions& Options);
523cab2bb3Spatrick
533cab2bb3Spatrick void SleepSeconds(int Seconds);
543cab2bb3Spatrick
553cab2bb3Spatrick unsigned long GetPid();
563cab2bb3Spatrick
573cab2bb3Spatrick size_t GetPeakRSSMb();
583cab2bb3Spatrick
593cab2bb3Spatrick int ExecuteCommand(const Command &Cmd);
601f9cb04fSpatrick bool ExecuteCommand(const Command &Cmd, std::string *CmdOutput);
613cab2bb3Spatrick
621f9cb04fSpatrick // Fuchsia does not have popen/pclose.
633cab2bb3Spatrick FILE *OpenProcessPipe(const char *Command, const char *Mode);
641f9cb04fSpatrick int CloseProcessPipe(FILE *F);
653cab2bb3Spatrick
663cab2bb3Spatrick const void *SearchMemory(const void *haystack, size_t haystacklen,
673cab2bb3Spatrick const void *needle, size_t needlelen);
683cab2bb3Spatrick
69*810390e3Srobert std::string CloneArgsWithoutX(const std::vector<std::string> &Args,
703cab2bb3Spatrick const char *X1, const char *X2);
713cab2bb3Spatrick
CloneArgsWithoutX(const std::vector<std::string> & Args,const char * X)72*810390e3Srobert inline std::string CloneArgsWithoutX(const std::vector<std::string> &Args,
733cab2bb3Spatrick const char *X) {
743cab2bb3Spatrick return CloneArgsWithoutX(Args, X, X);
753cab2bb3Spatrick }
763cab2bb3Spatrick
SplitBefore(std::string X,std::string S)773cab2bb3Spatrick inline std::pair<std::string, std::string> SplitBefore(std::string X,
783cab2bb3Spatrick std::string S) {
793cab2bb3Spatrick auto Pos = S.find(X);
803cab2bb3Spatrick if (Pos == std::string::npos)
813cab2bb3Spatrick return std::make_pair(S, "");
823cab2bb3Spatrick return std::make_pair(S.substr(0, Pos), S.substr(Pos));
833cab2bb3Spatrick }
843cab2bb3Spatrick
853cab2bb3Spatrick void DiscardOutput(int Fd);
863cab2bb3Spatrick
873cab2bb3Spatrick std::string DisassembleCmd(const std::string &FileName);
883cab2bb3Spatrick
893cab2bb3Spatrick std::string SearchRegexCmd(const std::string &Regex);
903cab2bb3Spatrick
91d89ec533Spatrick uint64_t SimpleFastHash(const void *Data, size_t Size, uint64_t Initial = 0);
923cab2bb3Spatrick
Log(size_t X)93d89ec533Spatrick inline size_t Log(size_t X) {
94d89ec533Spatrick return static_cast<size_t>((sizeof(unsigned long long) * 8) - Clzll(X) - 1);
95d89ec533Spatrick }
963cab2bb3Spatrick
PageSize()973cab2bb3Spatrick inline size_t PageSize() { return 4096; }
RoundUpByPage(uint8_t * P)983cab2bb3Spatrick inline uint8_t *RoundUpByPage(uint8_t *P) {
993cab2bb3Spatrick uintptr_t X = reinterpret_cast<uintptr_t>(P);
1003cab2bb3Spatrick size_t Mask = PageSize() - 1;
1013cab2bb3Spatrick X = (X + Mask) & ~Mask;
1023cab2bb3Spatrick return reinterpret_cast<uint8_t *>(X);
1033cab2bb3Spatrick }
RoundDownByPage(uint8_t * P)1043cab2bb3Spatrick inline uint8_t *RoundDownByPage(uint8_t *P) {
1053cab2bb3Spatrick uintptr_t X = reinterpret_cast<uintptr_t>(P);
1063cab2bb3Spatrick size_t Mask = PageSize() - 1;
1073cab2bb3Spatrick X = X & ~Mask;
1083cab2bb3Spatrick return reinterpret_cast<uint8_t *>(X);
1093cab2bb3Spatrick }
1103cab2bb3Spatrick
111d89ec533Spatrick #if __BYTE_ORDER == __LITTLE_ENDIAN
HostToLE(T X)112d89ec533Spatrick template <typename T> T HostToLE(T X) { return X; }
113d89ec533Spatrick #else
HostToLE(T X)114d89ec533Spatrick template <typename T> T HostToLE(T X) { return Bswap(X); }
115d89ec533Spatrick #endif
116d89ec533Spatrick
1173cab2bb3Spatrick } // namespace fuzzer
1183cab2bb3Spatrick
1193cab2bb3Spatrick #endif // LLVM_FUZZER_UTIL_H
120