<div dir="ltr"><div><div class="gmail_extra">'=' also doesn't work with oss-fuzz: <br><a href="https://github.com/google/oss-fuzz/blob/master/docs/new_project_guide.md#buildsh">https://github.com/google/oss-fuzz/blob/master/docs/new_project_guide.md#buildsh</a><br>make sure that the binary names for your fuzz targets contain only alphanumeric characters, underscore(_) or dash(-). Otherwise, they won't run on our infrastructure.<br>What about '--' (double-dash)?</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 11, 2017 at 9:35 PM, Justin Bogner via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: bogner<br>
Date: Wed Oct 11 21:35:32 2017<br>
New Revision: 315557<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=315557&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=315557&view=rev</a><br>
Log:<br>
Re-commit "llvm-isel-fuzzer: Handle a subset of backend flags in the exec name"<br>
<br>
Here we add a secondary option parser to llvm-isel-fuzzer (and provide<br>
it for use with other fuzzers). With this, you can copy the fuzzer to<br>
a name like llvm-isel-fuzzer=aarch64-gisel for a fuzzer that fuzzer<br>
AArch64 with GlobalISel enabled, or fuzzer=x86_64 to fuzz x86, with no<br>
flags required. This should be useful for running these in OSS-Fuzz.<br>
<br>
Note that this handrolls a subset of cl::opts to recognize, rather<br>
than embedding a complete command parser for argv[0]. If we find we<br>
really need the flexibility of handling arbitrary options at some<br>
point we can rethink this.<br>
<br>
This re-applies 315545 using "=" instead of ":" as a separator for<br>
arguments.<br>
<br>
Added:<br>
    llvm/trunk/test/tools/llvm-ise<wbr>l-fuzzer/aarch64-execname-opti<wbr>ons.ll<br>
    llvm/trunk/test/tools/llvm-ise<wbr>l-fuzzer/execname-options.ll<br>
Modified:<br>
    llvm/trunk/docs/FuzzingLLVM.rs<wbr>t<br>
    llvm/trunk/include/llvm/FuzzMu<wbr>tate/FuzzerCLI.h<br>
    llvm/trunk/lib/FuzzMutate/Fuzz<wbr>erCLI.cpp<br>
    llvm/trunk/tools/llvm-isel-fuz<wbr>zer/llvm-isel-fuzzer.cpp<br>
<br>
Modified: llvm/trunk/docs/FuzzingLLVM.rs<wbr>t<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/FuzzingLLVM.rst?rev=315557&r1=315556&r2=315557&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/docs/FuzzingL<wbr>LVM.rst?rev=315557&r1=315556&<wbr>r2=315557&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/docs/FuzzingLLVM.rs<wbr>t (original)<br>
+++ llvm/trunk/docs/FuzzingLLVM.rs<wbr>t Wed Oct 11 21:35:32 2017<br>
@@ -81,6 +81,13 @@ the following command would fuzz AArch64<br>
<br>
    % bin/llvm-isel-fuzzer <corpus-dir> -ignore_remaining_args=1 -mtriple aarch64 -global-isel -O0<br>
<br>
+Some flags can also be specified in the binary name itself in order to support<br>
+OSS Fuzz, which has trouble with required arguments. To do this, you can copy<br>
+or move ``llvm-isel-fuzzer`` to ``llvm-isel-fuzzer=x-y-z``, where x, y, and z<br>
+are architecture names (``aarch64``, ``x86_64``), optimization levels (``O0``,<br>
+``O2``), or specific keywords like ``gisel`` for enabling global instruction<br>
+selection.<br>
+<br>
 llvm-mc-assemble-fuzzer<br>
 -----------------------<br>
<br>
<br>
Modified: llvm/trunk/include/llvm/FuzzMu<wbr>tate/FuzzerCLI.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/FuzzMutate/FuzzerCLI.h?rev=315557&r1=315556&r2=315557&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>FuzzMutate/FuzzerCLI.h?rev=<wbr>315557&r1=315556&r2=315557&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/FuzzMu<wbr>tate/FuzzerCLI.h (original)<br>
+++ llvm/trunk/include/llvm/FuzzMu<wbr>tate/FuzzerCLI.h Wed Oct 11 21:35:32 2017<br>
@@ -15,6 +15,7 @@<br>
 #ifndef LLVM_FUZZMUTATE_FUZZER_CLI_H<br>
 #define LLVM_FUZZMUTATE_FUZZER_CLI_H<br>
<br>
+#include "llvm/ADT/StringRef.h"<br>
 #include "llvm/Support/DataTypes.h"<br>
<br>
 namespace llvm {<br>
@@ -24,6 +25,17 @@ namespace llvm {<br>
 /// This handles all arguments after -ignore_remaining_args=1 as cl::opts.<br>
 void parseFuzzerCLOpts(int ArgC, char *ArgV[]);<br>
<br>
+/// Handle backend options that are encoded in the executable name.<br>
+///<br>
+/// Parses some common backend options out of a specially crafted executable<br>
+/// name (argv[0]). For example, a name like llvm-foo-fuzzer:aarch64-gisel might<br>
+/// set up an AArch64 triple and the Global ISel selector. This should be called<br>
+/// *before* parseFuzzerCLOpts if calling both.<br>
+///<br>
+/// This is meant to be used for environments like OSS-Fuzz that aren't capable<br>
+/// of passing in command line arguments in the normal way.<br>
+void handleExecNameEncodedBEOpts(St<wbr>ringRef ExecName);<br>
+<br>
 using FuzzerTestFun = int (*)(const uint8_t *Data, size_t Size);<br>
 using FuzzerInitFun = int (*)(int *argc, char ***argv);<br>
<br>
<br>
Modified: llvm/trunk/lib/FuzzMutate/Fuzz<wbr>erCLI.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/FuzzMutate/FuzzerCLI.cpp?rev=315557&r1=315556&r2=315557&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/FuzzMutat<wbr>e/FuzzerCLI.cpp?rev=315557&r1=<wbr>315556&r2=315557&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/FuzzMutate/Fuzz<wbr>erCLI.cpp (original)<br>
+++ llvm/trunk/lib/FuzzMutate/Fuzz<wbr>erCLI.cpp Wed Oct 11 21:35:32 2017<br>
@@ -8,7 +8,7 @@<br>
 //===------------------------<wbr>------------------------------<wbr>----------------===//<br>
<br>
 #include "llvm/FuzzMutate/FuzzerCLI.h"<br>
-#include "llvm/ADT/StringRef.h"<br>
+#include "llvm/ADT/Triple.h"<br>
 #include "llvm/Support/CommandLine.h"<br>
 #include "llvm/Support/Compiler.h"<br>
 #include "llvm/Support/Error.h"<br>
@@ -30,6 +30,42 @@ void llvm::parseFuzzerCLOpts(int ArgC, c<br>
<br>
   cl::ParseCommandLineOptions(C<wbr>LArgs.size(), CLArgs.data());<br>
 }<br>
+<br>
+void llvm::handleExecNameEncodedBEO<wbr>pts(StringRef ExecName) {<br>
+  std::vector<std::string> Args{ExecName};<br>
+<br>
+  auto NameAndArgs = ExecName.split('=');<br>
+  if (NameAndArgs.second.empty())<br>
+    return;<br>
+<br>
+  SmallVector<StringRef, 4> Opts;<br>
+  NameAndArgs.second.split(Opts, '-');<br>
+  for (StringRef Opt : Opts) {<br>
+    if (Opt.equals("gisel")) {<br>
+      Args.push_back("-global-isel")<wbr>;<br>
+      // For now we default GlobalISel to -O0<br>
+      Args.push_back("-O0");<br>
+    } else if (Opt.startswith("O")) {<br>
+      Args.push_back("-" + Opt.str());<br>
+    } else if (Triple::getArchTypeForLLVMNam<wbr>e(Opt)) {<br>
+      Args.push_back("-mtriple=" + Opt.str());<br>
+    } else {<br>
+      errs() << ExecName << ": Unknown option: " << Opt << ".\n";<br>
+      exit(1);<br>
+    }<br>
+  }<br>
+  errs() << NameAndArgs.first << ": Injected args:";<br>
+  for (int I = 1, E = Args.size(); I < E; ++I)<br>
+    errs() << " " << Args[I];<br>
+  errs() << "\n";<br>
+<br>
+  std::vector<const char *> CLArgs;<br>
+  CLArgs.reserve(Args.size());<br>
+  for (std::string &S : Args)<br>
+    CLArgs.push_back(S.c_str());<br>
+<br>
+  cl::ParseCommandLineOptions(CL<wbr>Args.size(), CLArgs.data());<br>
+}<br>
<br>
 int llvm::runFuzzerOnInputs(int ArgC, char *ArgV[], FuzzerTestFun TestOne,<br>
                             FuzzerInitFun Init) {<br>
<br>
Added: llvm/trunk/test/tools/llvm-ise<wbr>l-fuzzer/aarch64-execname-opti<wbr>ons.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-isel-fuzzer/aarch64-execname-options.ll?rev=315557&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/tools/ll<wbr>vm-isel-fuzzer/aarch64-execnam<wbr>e-options.ll?rev=315557&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/tools/llvm-ise<wbr>l-fuzzer/aarch64-execname-opti<wbr>ons.ll (added)<br>
+++ llvm/trunk/test/tools/llvm-ise<wbr>l-fuzzer/aarch64-execname-opti<wbr>ons.ll Wed Oct 11 21:35:32 2017<br>
@@ -0,0 +1,15 @@<br>
+; REQUIRES: aarch64-registered-target<br>
+<br>
+; RUN: echo > %t.input<br>
+<br>
+; RUN: cp llvm-isel-fuzzer %t.bin=aarch64<br>
+; RUN: %t.bin=aarch64 %t.input 2>&1 | FileCheck -check-prefix=AARCH64 %s<br>
+; AARCH64: Injected args: -mtriple=aarch64<br>
+<br>
+; RUN: cp llvm-isel-fuzzer %t.bin=aarch64-O1<br>
+; RUN: %t.bin=aarch64-O1 %t.input 2>&1 | FileCheck -check-prefix=OPT-AFTER %s<br>
+; OPT-AFTER: Injected args: -mtriple=aarch64 -O1<br>
+<br>
+; RUN: cp llvm-isel-fuzzer %t.bin=O3-aarch64<br>
+; RUN: %t.bin=O3-aarch64 %t.input 2>&1 | FileCheck -check-prefix=OPT-BEFORE %s<br>
+; OPT-BEFORE: Injected args: -O3 -mtriple=aarch64<br>
<br>
Added: llvm/trunk/test/tools/llvm-ise<wbr>l-fuzzer/execname-options.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-isel-fuzzer/execname-options.ll?rev=315557&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/tools/ll<wbr>vm-isel-fuzzer/execname-option<wbr>s.ll?rev=315557&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/tools/llvm-ise<wbr>l-fuzzer/execname-options.ll (added)<br>
+++ llvm/trunk/test/tools/llvm-ise<wbr>l-fuzzer/execname-options.ll Wed Oct 11 21:35:32 2017<br>
@@ -0,0 +1,15 @@<br>
+; RUN: echo > %t.input<br>
+<br>
+; RUN: cp llvm-isel-fuzzer %t.bin=gisel<br>
+; RUN: not %t.bin=gisel %t.input 2>&1 | FileCheck -check-prefix=GISEL %s<br>
+; GISEL: Injected args: -global-isel -O0<br>
+; GISEL: -mtriple must be specified<br>
+<br>
+; RUN: cp llvm-isel-fuzzer %t.bin=gisel-O2<br>
+; RUN: not %t.bin=gisel-O2 %t.input 2>&1 | FileCheck -check-prefix=GISEL-O2 %s<br>
+; GISEL-O2: Injected args: -global-isel -O0 -O2<br>
+; GISEL-O2: -mtriple must be specified<br>
+<br>
+; RUN: cp llvm-isel-fuzzer %t.bin=unexist<br>
+; RUN: not %t.bin=unexist %t.input 2>&1 | FileCheck -check-prefix=NO-OPT %s<br>
+; NO-OPT: Unknown option:<br>
<br>
Modified: llvm/trunk/tools/llvm-isel-fuz<wbr>zer/llvm-isel-fuzzer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp?rev=315557&r1=315556&r2=315557&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/tools/llvm-is<wbr>el-fuzzer/llvm-isel-fuzzer.cpp<wbr>?rev=315557&r1=315556&r2=31555<wbr>7&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-isel-fuz<wbr>zer/llvm-isel-fuzzer.cpp (original)<br>
+++ llvm/trunk/tools/llvm-isel-fuz<wbr>zer/llvm-isel-fuzzer.cpp Wed Oct 11 21:35:32 2017<br>
@@ -150,11 +150,12 @@ extern "C" LLVM_ATTRIBUTE_USED int LLVMF<br>
   InitializeAllAsmPrinters();<br>
   InitializeAllAsmParsers();<br>
<br>
+  handleExecNameEncodedBEOpts(*a<wbr>rgv[0]);<br>
   parseFuzzerCLOpts(*argc, *argv);<br>
<br>
   if (TargetTriple.empty()) {<br>
     errs() << *argv[0] << ": -mtriple must be specified\n";<br>
-    return 1;<br>
+    exit(1);<br>
   }<br>
<br>
   Triple TheTriple = Triple(Triple::normalize(Targe<wbr>tTriple));<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div></div>