brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 0904978 Raw
74 lines · cpp
1//===- llvm-bolt-fuzzer.cpp - Fuzzing target for llvm-bolt ----------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "bolt/Rewrite/RewriteInstance.h"10#include "llvm/Support/CommandLine.h"11#include "llvm/Support/TargetSelect.h"12 13using namespace llvm;14using namespace object;15using namespace bolt;16 17namespace opts {18extern cl::opt<std::string> OutputFilename;19extern cl::opt<bool> Lite;20} // namespace opts21 22extern "C" int LLVMFuzzerTestOneInput(const char *Data, size_t Size) {23  const char *argv[] = {"llvm-bolt", nullptr};24  const char argc = 1;25  opts::OutputFilename = "/dev/null";26  opts::Lite = false;27 28  // Input has to be an ELF - we don't want to fuzz createBinary interface.29  if (Size < 4 || strncmp("\177ELF", Data, 4) != 0)30    return 0;31  // Construct an ELF binary from fuzzer input.32  std::unique_ptr<MemoryBuffer> Buffer =33      MemoryBuffer::getMemBuffer(StringRef(Data, Size), "", false);34  Expected<std::unique_ptr<Binary>> BinaryOrErr =35      createBinary(Buffer->getMemBufferRef());36  // Check that the input is a valid binary.37  if (Error E = BinaryOrErr.takeError()) {38    consumeError(std::move(E));39    return 0;40  }41  Binary &Binary = *BinaryOrErr.get();42  // Check that the binary is an ELF64LE object file.43  auto *E = dyn_cast<ELF64LEObjectFile>(&Binary);44  if (!E)45    return 0;46 47  // Fuzz RewriteInstance.48  auto RIOrErr = RewriteInstance::create(E, argc, argv, "llvm-bolt");49  if (Error E = RIOrErr.takeError()) {50    consumeError(std::move(E));51    return 0;52  }53  RewriteInstance &RI = *RIOrErr.get();54  if (Error E = RI.run())55    consumeError(std::move(E));56  return 0;57}58 59extern "C" LLVM_ATTRIBUTE_USED int LLVMFuzzerInitialize(int *argc,60                                                        char ***argv) {61  // Initialize targets and assembly printers/parsers.62#define BOLT_TARGET(target)                                                    \63  LLVMInitialize##target##TargetInfo();                                        \64  LLVMInitialize##target##TargetMC();                                          \65  LLVMInitialize##target##AsmParser();                                         \66  LLVMInitialize##target##Disassembler();                                      \67  LLVMInitialize##target##Target();                                            \68  LLVMInitialize##target##AsmPrinter();69 70#include "bolt/Core/TargetConfig.def"71 72  return 0;73}74