Path: blob/main/contrib/llvm-project/llvm/lib/FuzzMutate/FuzzerCLI.cpp
35233 views
//===-- FuzzerCLI.cpp -----------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/FuzzMutate/FuzzerCLI.h"9#include "llvm/ADT/StringRef.h"10#include "llvm/Support/CommandLine.h"11#include "llvm/Support/MemoryBuffer.h"12#include "llvm/Support/raw_ostream.h"13#include "llvm/TargetParser/Triple.h"1415using namespace llvm;1617void llvm::parseFuzzerCLOpts(int ArgC, char *ArgV[]) {18std::vector<const char *> CLArgs;19CLArgs.push_back(ArgV[0]);2021int I = 1;22while (I < ArgC)23if (StringRef(ArgV[I++]) == "-ignore_remaining_args=1")24break;25while (I < ArgC)26CLArgs.push_back(ArgV[I++]);2728cl::ParseCommandLineOptions(CLArgs.size(), CLArgs.data());29}3031void llvm::handleExecNameEncodedBEOpts(StringRef ExecName) {32std::vector<std::string> Args{std::string(ExecName)};3334auto NameAndArgs = ExecName.split("--");35if (NameAndArgs.second.empty())36return;3738SmallVector<StringRef, 4> Opts;39NameAndArgs.second.split(Opts, '-');40for (StringRef Opt : Opts) {41if (Opt == "gisel") {42Args.push_back("-global-isel");43// For now we default GlobalISel to -O044Args.push_back("-O0");45} else if (Opt.starts_with("O")) {46Args.push_back("-" + Opt.str());47} else if (Triple(Opt).getArch()) {48Args.push_back("-mtriple=" + Opt.str());49} else {50errs() << ExecName << ": Unknown option: " << Opt << ".\n";51exit(1);52}53}54errs() << NameAndArgs.first << ": Injected args:";55for (int I = 1, E = Args.size(); I < E; ++I)56errs() << " " << Args[I];57errs() << "\n";5859std::vector<const char *> CLArgs;60CLArgs.reserve(Args.size());61for (std::string &S : Args)62CLArgs.push_back(S.c_str());6364cl::ParseCommandLineOptions(CLArgs.size(), CLArgs.data());65}6667void llvm::handleExecNameEncodedOptimizerOpts(StringRef ExecName) {68// TODO: Refactor parts common with the 'handleExecNameEncodedBEOpts'69std::vector<std::string> Args{std::string(ExecName)};7071auto NameAndArgs = ExecName.split("--");72if (NameAndArgs.second.empty())73return;7475SmallVector<StringRef, 4> Opts;76NameAndArgs.second.split(Opts, '-');77for (StringRef Opt : Opts) {78if (Opt == "instcombine") {79Args.push_back("-passes=instcombine");80} else if (Opt == "earlycse") {81Args.push_back("-passes=early-cse");82} else if (Opt == "simplifycfg") {83Args.push_back("-passes=simplifycfg");84} else if (Opt == "gvn") {85Args.push_back("-passes=gvn");86} else if (Opt == "sccp") {87Args.push_back("-passes=sccp");88} else if (Opt == "loop_predication") {89Args.push_back("-passes=loop-predication");90} else if (Opt == "guard_widening") {91Args.push_back("-passes=guard-widening");92} else if (Opt == "loop_rotate") {93Args.push_back("-passes=loop-rotate");94} else if (Opt == "loop_unswitch") {95Args.push_back("-passes=loop(simple-loop-unswitch)");96} else if (Opt == "loop_unroll") {97Args.push_back("-passes=unroll");98} else if (Opt == "loop_vectorize") {99Args.push_back("-passes=loop-vectorize");100} else if (Opt == "licm") {101Args.push_back("-passes=licm");102} else if (Opt == "indvars") {103Args.push_back("-passes=indvars");104} else if (Opt == "strength_reduce") {105Args.push_back("-passes=loop-reduce");106} else if (Opt == "irce") {107Args.push_back("-passes=irce");108} else if (Opt == "dse") {109Args.push_back("-passes=dse");110} else if (Opt == "loop_idiom") {111Args.push_back("-passes=loop-idiom");112} else if (Opt == "reassociate") {113Args.push_back("-passes=reassociate");114} else if (Opt == "lower_matrix_intrinsics") {115Args.push_back("-passes=lower-matrix-intrinsics");116} else if (Opt == "memcpyopt") {117Args.push_back("-passes=memcpyopt");118} else if (Opt == "sroa") {119Args.push_back("-passes=sroa");120} else if (Triple(Opt).getArch()) {121Args.push_back("-mtriple=" + Opt.str());122} else {123errs() << ExecName << ": Unknown option: " << Opt << ".\n";124exit(1);125}126}127128errs() << NameAndArgs.first << ": Injected args:";129for (int I = 1, E = Args.size(); I < E; ++I)130errs() << " " << Args[I];131errs() << "\n";132133std::vector<const char *> CLArgs;134CLArgs.reserve(Args.size());135for (std::string &S : Args)136CLArgs.push_back(S.c_str());137138cl::ParseCommandLineOptions(CLArgs.size(), CLArgs.data());139}140141int llvm::runFuzzerOnInputs(int ArgC, char *ArgV[], FuzzerTestFun TestOne,142FuzzerInitFun Init) {143errs() << "*** This tool was not linked to libFuzzer.\n"144<< "*** No fuzzing will be performed.\n";145if (int RC = Init(&ArgC, &ArgV)) {146errs() << "Initialization failed\n";147return RC;148}149150for (int I = 1; I < ArgC; ++I) {151StringRef Arg(ArgV[I]);152if (Arg.starts_with("-")) {153if (Arg == "-ignore_remaining_args=1")154break;155continue;156}157158auto BufOrErr = MemoryBuffer::getFile(Arg, /*IsText=*/false,159/*RequiresNullTerminator=*/false);160if (std::error_code EC = BufOrErr.getError()) {161errs() << "Error reading file: " << Arg << ": " << EC.message() << "\n";162return 1;163}164std::unique_ptr<MemoryBuffer> Buf = std::move(BufOrErr.get());165errs() << "Running: " << Arg << " (" << Buf->getBufferSize() << " bytes)\n";166TestOne(reinterpret_cast<const uint8_t *>(Buf->getBufferStart()),167Buf->getBufferSize());168}169return 0;170}171172173