[llvm] r315545 - llvm-isel-fuzzer: Handle a subset of backend flags in the executable name

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 11 21:38:43 PDT 2017


Justin Bogner <mail at justinbogner.com> writes:
> Hans Wennborg <hans at chromium.org> writes:
>> I've reverted in r315554
>>
>> It broke some buildbots:
>> http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/12671/steps/test/logs/stdio
>> http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/5402/steps/test-check-all/logs/stdio
>
> These failures are kind of confusing. I guess the failures in the two
> tests I added are because windows doesn't like ':' in filenames. That
> part's fine, but I don't understand why a bunch of other tests are
> failing too, given that this change should not change their behaviour at
> all.
>
> I might need some help with this.

Nevermind, I see what the problem was here. This was all related to
trying to use ':' as a separator, and we ended up doing strange things
because of C: on windows. I've re-committed in r315557 with a version
that does not use ':'.

>> (Also one -Werror bot:
>> http://lab.llvm.org:8011/builders/ubuntu-gcc7.1-werror/builds/2197/steps/build-unified-tree/logs/stdio)
>
> Oops, sorry about that.
>
>> On Wed, Oct 11, 2017 at 6:57 PM, Justin Bogner via llvm-commits
>> <llvm-commits at lists.llvm.org> wrote:
>>> Author: bogner
>>> Date: Wed Oct 11 18:57:49 2017
>>> New Revision: 315545
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=315545&view=rev
>>> Log:
>>> llvm-isel-fuzzer: Handle a subset of backend flags in the executable name
>>>
>>> Here we add a secondary option parser to llvm-isel-fuzzer (and provide
>>> it for use with other fuzzers). With this, you can copy the fuzzer to
>>> a name like llvm-isel-fuzzer:aarch64-gisel for a fuzzer that fuzzer
>>> AArch64 with GlobalISel enabled, or fuzzer:x86_64 to fuzz x86, with no
>>> flags required. This should be useful for running these in OSS-Fuzz.
>>>
>>> Note that this handrolls a subset of cl::opts to recognize, rather
>>> than embedding a complete command parser for argv[0]. If we find we
>>> really need the flexibility of handling arbitrary options at some
>>> point we can rethink this.
>>>
>>> Added:
>>>     llvm/trunk/test/tools/llvm-isel-fuzzer/aarch64-execname-options.ll
>>>     llvm/trunk/test/tools/llvm-isel-fuzzer/execname-options.ll
>>> Modified:
>>>     llvm/trunk/docs/FuzzingLLVM.rst
>>>     llvm/trunk/include/llvm/FuzzMutate/FuzzerCLI.h
>>>     llvm/trunk/lib/FuzzMutate/FuzzerCLI.cpp
>>>     llvm/trunk/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp
>>>
>>> Modified: llvm/trunk/docs/FuzzingLLVM.rst
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/FuzzingLLVM.rst?rev=315545&r1=315544&r2=315545&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/docs/FuzzingLLVM.rst (original)
>>> +++ llvm/trunk/docs/FuzzingLLVM.rst Wed Oct 11 18:57:49 2017
>>> @@ -76,6 +76,13 @@ the following command would fuzz AArch64
>>>
>>>     % bin/llvm-isel-fuzzer <corpus-dir> -ignore_remaining_args=1 -mtriple aarch64 -global-isel -O0
>>>
>>> +Some flags can also be specified in the binary name itself in order to support
>>> +OSS Fuzz, which has trouble with required arguments. To do this, you can copy
>>> +or move ``llvm-isel-fuzzer`` to ``llvm-isel-fuzzer:x-y-z``, where x, y, and z
>>> +are architecture names (``aarch64``, ``x86_64``), optimization levels (``O0``,
>>> +``O2``), or specific keywords like ``gisel`` for enabling global instruction
>>> +selection.
>>> +
>>>  llvm-mc-assemble-fuzzer
>>>  -----------------------
>>>
>>>
>>> Modified: llvm/trunk/include/llvm/FuzzMutate/FuzzerCLI.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/FuzzMutate/FuzzerCLI.h?rev=315545&r1=315544&r2=315545&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/FuzzMutate/FuzzerCLI.h (original)
>>> +++ llvm/trunk/include/llvm/FuzzMutate/FuzzerCLI.h Wed Oct 11 18:57:49 2017
>>> @@ -15,6 +15,7 @@
>>>  #ifndef LLVM_FUZZMUTATE_FUZZER_CLI_H
>>>  #define LLVM_FUZZMUTATE_FUZZER_CLI_H
>>>
>>> +#include "llvm/ADT/StringRef.h"
>>>  #include "llvm/Support/DataTypes.h"
>>>
>>>  namespace llvm {
>>> @@ -24,6 +25,17 @@ namespace llvm {
>>>  /// This handles all arguments after -ignore_remaining_args=1 as cl::opts.
>>>  void parseFuzzerCLOpts(int ArgC, char *ArgV[]);
>>>
>>> +/// Handle backend options that are encoded in the executable name.
>>> +///
>>> +/// Parses some common backend options out of a specially crafted executable
>>> +/// name (argv[0]). For example, a name like llvm-foo-fuzzer:aarch64-gisel might
>>> +/// set up an AArch64 triple and the Global ISel selector. This should be called
>>> +/// *before* parseFuzzerCLOpts if calling both.
>>> +///
>>> +/// This is meant to be used for environments like OSS-Fuzz that aren't capable
>>> +/// of passing in command line arguments in the normal way.
>>> +void handleExecNameEncodedBEOpts(StringRef ExecName);
>>> +
>>>  using FuzzerTestFun = int (*)(const uint8_t *Data, size_t Size);
>>>  using FuzzerInitFun = int (*)(int *argc, char ***argv);
>>>
>>>
>>> Modified: llvm/trunk/lib/FuzzMutate/FuzzerCLI.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/FuzzMutate/FuzzerCLI.cpp?rev=315545&r1=315544&r2=315545&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/FuzzMutate/FuzzerCLI.cpp (original)
>>> +++ llvm/trunk/lib/FuzzMutate/FuzzerCLI.cpp Wed Oct 11 18:57:49 2017
>>> @@ -8,7 +8,7 @@
>>>  //===----------------------------------------------------------------------===//
>>>
>>>  #include "llvm/FuzzMutate/FuzzerCLI.h"
>>> -#include "llvm/ADT/StringRef.h"
>>> +#include "llvm/ADT/Triple.h"
>>>  #include "llvm/Support/CommandLine.h"
>>>  #include "llvm/Support/Compiler.h"
>>>  #include "llvm/Support/Error.h"
>>> @@ -30,6 +30,42 @@ void llvm::parseFuzzerCLOpts(int ArgC, c
>>>
>>>    cl::ParseCommandLineOptions(CLArgs.size(), CLArgs.data());
>>>  }
>>> +
>>> +void llvm::handleExecNameEncodedBEOpts(StringRef ExecName) {
>>> +  std::vector<std::string> Args{ExecName};
>>> +
>>> +  auto NameAndArgs = ExecName.split(':');
>>> +  if (NameAndArgs.second.empty())
>>> +    return;
>>> +
>>> +  SmallVector<StringRef, 4> Opts;
>>> +  NameAndArgs.second.split(Opts, '-');
>>> +  for (StringRef Opt : Opts) {
>>> +    if (Opt.equals("gisel")) {
>>> +      Args.push_back("-global-isel");
>>> +      // For now we default GlobalISel to -O0
>>> +      Args.push_back("-O0");
>>> +    } else if (Opt.startswith("O")) {
>>> +      Args.push_back("-" + Opt.str());
>>> +    } else if (auto Arch = Triple::getArchTypeForLLVMName(Opt)) {
>>> +      Args.push_back("-mtriple=" + Opt.str());
>>> +    } else {
>>> +      errs() << ExecName << ": Unknown option: " << Opt << ".\n";
>>> +      exit(1);
>>> +    }
>>> +  }
>>> +  errs() << NameAndArgs.first << ": Injected args:";
>>> +  for (int I = 1, E = Args.size(); I < E; ++I)
>>> +    errs() << " " << Args[I];
>>> +  errs() << "\n";
>>> +
>>> +  std::vector<const char *> CLArgs;
>>> +  CLArgs.reserve(Args.size());
>>> +  for (std::string &S : Args)
>>> +    CLArgs.push_back(S.c_str());
>>> +
>>> +  cl::ParseCommandLineOptions(CLArgs.size(), CLArgs.data());
>>> +}
>>>
>>>  int llvm::runFuzzerOnInputs(int ArgC, char *ArgV[], FuzzerTestFun TestOne,
>>>                              FuzzerInitFun Init) {
>>>
>>> Added: llvm/trunk/test/tools/llvm-isel-fuzzer/aarch64-execname-options.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-isel-fuzzer/aarch64-execname-options.ll?rev=315545&view=auto
>>> ==============================================================================
>>> --- llvm/trunk/test/tools/llvm-isel-fuzzer/aarch64-execname-options.ll (added)
>>> +++ llvm/trunk/test/tools/llvm-isel-fuzzer/aarch64-execname-options.ll Wed Oct 11 18:57:49 2017
>>> @@ -0,0 +1,15 @@
>>> +; REQUIRES: aarch64-registered-target
>>> +
>>> +; RUN: echo > %t.input
>>> +
>>> +; RUN: cp llvm-isel-fuzzer %t.bin:aarch64
>>> +; RUN: %t.bin:aarch64 %t.input 2>&1 | FileCheck -check-prefix=AARCH64 %s
>>> +; AARCH64: Injected args: -mtriple=aarch64
>>> +
>>> +; RUN: mv %t.bin:aarch64 %t.bin:aarch64-O1
>>> +; RUN: %t.bin:aarch64-O1 %t.input 2>&1 | FileCheck -check-prefix=OPT-AFTER %s
>>> +; OPT-AFTER: Injected args: -mtriple=aarch64 -O1
>>> +
>>> +; RUN: mv %t.bin:aarch64-O1 %t.bin:O3-aarch64
>>> +; RUN: %t.bin:O3-aarch64 %t.input 2>&1 | FileCheck -check-prefix=OPT-BEFORE %s
>>> +; OPT-BEFORE: Injected args: -O3 -mtriple=aarch64
>>>
>>> Added: llvm/trunk/test/tools/llvm-isel-fuzzer/execname-options.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-isel-fuzzer/execname-options.ll?rev=315545&view=auto
>>> ==============================================================================
>>> --- llvm/trunk/test/tools/llvm-isel-fuzzer/execname-options.ll (added)
>>> +++ llvm/trunk/test/tools/llvm-isel-fuzzer/execname-options.ll Wed Oct 11 18:57:49 2017
>>> @@ -0,0 +1,15 @@
>>> +; RUN: echo > %t.input
>>> +
>>> +; RUN: cp llvm-isel-fuzzer %t.bin:gisel
>>> +; RUN: not %t.bin:gisel %t.input 2>&1 | FileCheck -check-prefix=GISEL %s
>>> +; GISEL: Injected args: -global-isel -O0
>>> +; GISEL: -mtriple must be specified
>>> +
>>> +; RUN: cp llvm-isel-fuzzer %t.bin:gisel-O2
>>> +; RUN: not %t.bin:gisel-O2 %t.input 2>&1 | FileCheck -check-prefix=GISEL-O2 %s
>>> +; GISEL-O2: Injected args: -global-isel -O0 -O2
>>> +; GISEL-O2: -mtriple must be specified
>>> +
>>> +; RUN: cp llvm-isel-fuzzer %t.bin:unexist
>>> +; RUN: not %t.bin:unexist %t.input 2>&1 | FileCheck -check-prefix=NO-OPT %s
>>> +; NO-OPT: Unknown option:
>>>
>>> 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=315545&r1=315544&r2=315545&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp (original)
>>> +++ llvm/trunk/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp Wed Oct 11 18:57:49 2017
>>> @@ -150,6 +150,7 @@ extern "C" LLVM_ATTRIBUTE_USED int LLVMF
>>>    InitializeAllAsmPrinters();
>>>    InitializeAllAsmParsers();
>>>
>>> +  handleExecNameEncodedBEOpts(*argv[0]);
>>>    parseFuzzerCLOpts(*argc, *argv);
>>>
>>>    if (TargetTriple.empty()) {
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list