[llvm] r312425 - Move some CLI utils out of llvm-isel-fuzzer and into the library

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Sat Sep 2 16:43:04 PDT 2017


Author: bogner
Date: Sat Sep  2 16:43:04 2017
New Revision: 312425

URL: http://llvm.org/viewvc/llvm-project?rev=312425&view=rev
Log:
Move some CLI utils out of llvm-isel-fuzzer and into the library

FuzzMutate might not be the best place for these, but it makes more
sense than an entirely new library for now. This will make setting up
fuzz targets with consistent CLI handling easier.

Added:
    llvm/trunk/include/llvm/FuzzMutate/FuzzerCLI.h
    llvm/trunk/lib/FuzzMutate/FuzzerCLI.cpp
      - copied, changed from r312424, llvm/trunk/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp
Modified:
    llvm/trunk/cmake/modules/AddLLVM.cmake
    llvm/trunk/lib/FuzzMutate/CMakeLists.txt
    llvm/trunk/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp
    llvm/trunk/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp

Modified: llvm/trunk/cmake/modules/AddLLVM.cmake
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/modules/AddLLVM.cmake?rev=312425&r1=312424&r2=312425&view=diff
==============================================================================
--- llvm/trunk/cmake/modules/AddLLVM.cmake (original)
+++ llvm/trunk/cmake/modules/AddLLVM.cmake Sat Sep  2 16:43:04 2017
@@ -896,6 +896,7 @@ macro(add_llvm_fuzzer name)
   cmake_parse_arguments(ARG "" "DUMMY_MAIN" "" ${ARGN})
   if( LLVM_USE_SANITIZE_COVERAGE )
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer")
+    set(LLVM_OPTIONAL_SOURCES ${ARG_DUMMY_MAIN})
     add_llvm_executable(${name} ${ARG_UNPARSED_ARGUMENTS})
     set_target_properties(${name} PROPERTIES FOLDER "Fuzzers")
   elseif( ARG_DUMMY_MAIN )

Added: llvm/trunk/include/llvm/FuzzMutate/FuzzerCLI.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/FuzzMutate/FuzzerCLI.h?rev=312425&view=auto
==============================================================================
--- llvm/trunk/include/llvm/FuzzMutate/FuzzerCLI.h (added)
+++ llvm/trunk/include/llvm/FuzzMutate/FuzzerCLI.h Sat Sep  2 16:43:04 2017
@@ -0,0 +1,39 @@
+//===-- FuzzerCLI.h - Common logic for CLIs of fuzzers ----------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Common logic needed to implement LLVM's fuzz targets' CLIs - including LLVM
+// concepts like cl::opt and libFuzzer concepts like -ignore_remaining_args=1.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_FUZZMUTATE_FUZZER_CLI_H
+#define LLVM_FUZZMUTATE_FUZZER_CLI_H
+
+#include "llvm/Support/DataTypes.h"
+
+namespace llvm {
+
+/// Parse cl::opts from a fuzz target commandline.
+///
+/// This handles all arguments after -ignore_remaining_args=1 as cl::opts.
+void parseFuzzerCLOpts(int ArgC, char *ArgV[]);
+
+using FuzzerTestFun = int (*)(const uint8_t *Data, size_t Size);
+using FuzzerInitFun = int (*)(int *argc, char ***argv);
+
+/// Runs a fuzz target on the inputs specified on the command line.
+///
+/// Useful for testing fuzz targets without linking to libFuzzer. Finds inputs
+/// in the argument list in a libFuzzer compatible way.
+int runFuzzerOnInputs(int ArgC, char *ArgV[], FuzzerTestFun TestOne,
+                      FuzzerInitFun Init = [](int *, char ***) { return 0; });
+
+} // end llvm namespace
+
+#endif // LLVM_FUZZMUTATE_FUZZER_CLI_H

Modified: llvm/trunk/lib/FuzzMutate/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/FuzzMutate/CMakeLists.txt?rev=312425&r1=312424&r2=312425&view=diff
==============================================================================
--- llvm/trunk/lib/FuzzMutate/CMakeLists.txt (original)
+++ llvm/trunk/lib/FuzzMutate/CMakeLists.txt Sat Sep  2 16:43:04 2017
@@ -1,4 +1,5 @@
 add_llvm_library(LLVMFuzzMutate
+  FuzzerCLI.cpp
   IRMutator.cpp
   OpDescriptor.cpp
   Operations.cpp

Copied: llvm/trunk/lib/FuzzMutate/FuzzerCLI.cpp (from r312424, llvm/trunk/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/FuzzMutate/FuzzerCLI.cpp?p2=llvm/trunk/lib/FuzzMutate/FuzzerCLI.cpp&p1=llvm/trunk/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp&r1=312424&r2=312425&rev=312425&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp (original)
+++ llvm/trunk/lib/FuzzMutate/FuzzerCLI.cpp Sat Sep  2 16:43:04 2017
@@ -1,4 +1,4 @@
-//===--- DummyFuzzerMain.cpp - Entry point to sanity check the fuzzer -----===//
+//===-- FuzzerCLI.cpp -----------------------------------------------------===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -6,12 +6,10 @@
 // License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
-//
-// Implementation of main so we can build and test without linking libFuzzer.
-//
-//===----------------------------------------------------------------------===//
 
+#include "llvm/FuzzMutate/FuzzerCLI.h"
 #include "llvm/ADT/StringRef.h"
+#include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/MemoryBuffer.h"
@@ -19,19 +17,31 @@
 
 using namespace llvm;
 
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
-extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv);
+void llvm::parseFuzzerCLOpts(int ArgC, char *ArgV[]) {
+  std::vector<const char *> CLArgs;
+  CLArgs.push_back(ArgV[0]);
+
+  int I = 1;
+  while (I < ArgC)
+    if (StringRef(ArgV[I++]).equals("-ignore_remaining_args=1"))
+      break;
+  while (I < ArgC)
+    CLArgs.push_back(ArgV[I++]);
+
+  cl::ParseCommandLineOptions(CLArgs.size(), CLArgs.data());
+}
 
-int main(int argc, char *argv[]) {
+int llvm::runFuzzerOnInputs(int ArgC, char *ArgV[], FuzzerTestFun TestOne,
+                            FuzzerInitFun Init) {
   errs() << "*** This tool was not linked to libFuzzer.\n"
          << "*** No fuzzing will be performed.\n";
-  if (int RC = LLVMFuzzerInitialize(&argc, &argv)) {
+  if (int RC = Init(&ArgC, &ArgV)) {
     errs() << "Initialization failed\n";
     return RC;
   }
 
-  for (int I = 1; I < argc; ++I) {
-    StringRef Arg(argv[I]);
+  for (int I = 1; I < ArgC; ++I) {
+    StringRef Arg(ArgV[I]);
     if (Arg.startswith("-")) {
       if (Arg.equals("-ignore_remaining_args=1"))
         break;
@@ -46,8 +56,8 @@ int main(int argc, char *argv[]) {
     }
     std::unique_ptr<MemoryBuffer> Buf = std::move(BufOrErr.get());
     errs() << "Running: " << Arg << " (" << Buf->getBufferSize() << " bytes)\n";
-    LLVMFuzzerTestOneInput(
-        reinterpret_cast<const uint8_t *>(Buf->getBufferStart()),
-        Buf->getBufferSize());
+    TestOne(reinterpret_cast<const uint8_t *>(Buf->getBufferStart()),
+            Buf->getBufferSize());
   }
+  return 0;
 }

Modified: llvm/trunk/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp?rev=312425&r1=312424&r2=312425&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp (original)
+++ llvm/trunk/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp Sat Sep  2 16:43:04 2017
@@ -11,43 +11,11 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/Compiler.h"
-#include "llvm/Support/Error.h"
-#include "llvm/Support/MemoryBuffer.h"
-#include "llvm/Support/raw_ostream.h"
-
-using namespace llvm;
+#include "llvm/FuzzMutate/FuzzerCLI.h"
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
 extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv);
-
 int main(int argc, char *argv[]) {
-  errs() << "*** This tool was not linked to libFuzzer.\n"
-         << "*** No fuzzing will be performed.\n";
-  if (int RC = LLVMFuzzerInitialize(&argc, &argv)) {
-    errs() << "Initialization failed\n";
-    return RC;
-  }
-
-  for (int I = 1; I < argc; ++I) {
-    StringRef Arg(argv[I]);
-    if (Arg.startswith("-")) {
-      if (Arg.equals("-ignore_remaining_args=1"))
-        break;
-      continue;
-    }
-
-    auto BufOrErr = MemoryBuffer::getFile(Arg, /*FileSize-*/ -1,
-                                          /*RequiresNullTerminator=*/false);
-    if (std::error_code EC = BufOrErr.getError()) {
-      errs() << "Error reading file: " << Arg << ": " << EC.message() << "\n";
-      return 1;
-    }
-    std::unique_ptr<MemoryBuffer> Buf = std::move(BufOrErr.get());
-    errs() << "Running: " << Arg << " (" << Buf->getBufferSize() << " bytes)\n";
-    LLVMFuzzerTestOneInput(
-        reinterpret_cast<const uint8_t *>(Buf->getBufferStart()),
-        Buf->getBufferSize());
-  }
+  return llvm::runFuzzerOnInputs(argc, argv, LLVMFuzzerTestOneInput,
+                                 LLVMFuzzerInitialize);
 }

Modified: llvm/trunk/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp?rev=312425&r1=312424&r2=312425&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp (original)
+++ llvm/trunk/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp Sat Sep  2 16:43:04 2017
@@ -16,6 +16,7 @@
 #include "llvm/Bitcode/BitcodeReader.h"
 #include "llvm/Bitcode/BitcodeWriter.h"
 #include "llvm/CodeGen/CommandFlags.h"
+#include "llvm/FuzzMutate/FuzzerCLI.h"
 #include "llvm/FuzzMutate/IRMutator.h"
 #include "llvm/FuzzMutate/Operations.h"
 #include "llvm/FuzzMutate/Random.h"
@@ -133,21 +134,6 @@ extern "C" int LLVMFuzzerTestOneInput(co
   return 0;
 }
 
-/// Parse command line options, but ignore anything before '--'.
-static void parseCLOptsAfterDashDash(int argc, char *argv[]) {
-  std::vector<const char *> CLArgs;
-  CLArgs.push_back(argv[0]);
-
-  int I = 1;
-  while (I < argc)
-    if (StringRef(argv[I++]).equals("-ignore_remaining_args=1"))
-      break;
-  while (I < argc)
-    CLArgs.push_back(argv[I++]);
-
-  cl::ParseCommandLineOptions(CLArgs.size(), CLArgs.data());
-}
-
 static void handleLLVMFatalError(void *, const std::string &Message, bool) {
   // TODO: Would it be better to call into the fuzzer internals directly?
   dbgs() << "LLVM ERROR: " << Message << "\n"
@@ -164,7 +150,7 @@ extern "C" LLVM_ATTRIBUTE_USED int LLVMF
   InitializeAllAsmPrinters();
   InitializeAllAsmParsers();
 
-  parseCLOptsAfterDashDash(*argc, *argv);
+  parseFuzzerCLOpts(*argc, *argv);
 
   if (TargetTriple.empty()) {
     errs() << *argv[0] << ": -mtriple must be specified\n";




More information about the llvm-commits mailing list