Index: llvm/test/tools/llvm-reduce/command-line-behavior.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-reduce/command-line-behavior.test @@ -0,0 +1,12 @@ +# Print the help output if no arguments are specified +# RUN: llvm-reduce --help | grep "LLVM automatic testcase reducer" +# RUN: llvm-reduce | grep "LLVM automatic testcase reducer" + +# Don't require any other arguments for --print-delta-passes +# RUN: llvm-reduce --print-delta-passes | grep "Delta passes (pass to \`--delta-passes=\` as a comma separated list)" + +# Missing test input +# RUN: not llvm-reduce --test FileCheck 2>&1 | grep "error: reduction testcase positional argument must be specified" + +# Missing test script +# RUN: not llvm-reduce some-input 2>&1 | grep "error: --test option must be specified" Index: llvm/tools/llvm-reduce/ReducerWorkItem.h =================================================================== --- llvm/tools/llvm-reduce/ReducerWorkItem.h +++ llvm/tools/llvm-reduce/ReducerWorkItem.h @@ -44,9 +44,8 @@ }; std::pair, bool> -parseReducerWorkItem(const char *ToolName, StringRef Filename, - LLVMContext &Ctxt, std::unique_ptr &TM, - bool IsMIR); +parseReducerWorkItem(StringRef ToolName, StringRef Filename, LLVMContext &Ctxt, + std::unique_ptr &TM, bool IsMIR); std::unique_ptr cloneReducerWorkItem(const ReducerWorkItem &MMM, const TargetMachine *TM); Index: llvm/tools/llvm-reduce/ReducerWorkItem.cpp =================================================================== --- llvm/tools/llvm-reduce/ReducerWorkItem.cpp +++ llvm/tools/llvm-reduce/ReducerWorkItem.cpp @@ -39,7 +39,8 @@ cl::desc("Set the target triple"), cl::cat(LLVMReduceOptions)); -void readBitcode(ReducerWorkItem &M, MemoryBufferRef Data, LLVMContext &Ctx, const char *ToolName); +void readBitcode(ReducerWorkItem &M, MemoryBufferRef Data, LLVMContext &Ctx, + StringRef ToolName); static void cloneFrameInfo( MachineFrameInfo &DstMFI, const MachineFrameInfo &SrcMFI, @@ -387,9 +388,8 @@ } std::pair, bool> -parseReducerWorkItem(const char *ToolName, StringRef Filename, - LLVMContext &Ctxt, std::unique_ptr &TM, - bool IsMIR) { +parseReducerWorkItem(StringRef ToolName, StringRef Filename, LLVMContext &Ctxt, + std::unique_ptr &TM, bool IsMIR) { bool IsBitcode = false; Triple TheTriple; @@ -456,7 +456,7 @@ (const unsigned char *)(*MB)->getBufferEnd())) { std::unique_ptr Result = parseIRFile(Filename, Err, Ctxt); if (!Result) { - Err.print(ToolName, errs()); + Err.print(ToolName.data(), errs()); return {nullptr, false}; } MMM->M = std::move(Result); Index: llvm/tools/llvm-reduce/TestRunner.h =================================================================== --- llvm/tools/llvm-reduce/TestRunner.h +++ llvm/tools/llvm-reduce/TestRunner.h @@ -28,7 +28,7 @@ public: TestRunner(StringRef TestName, const std::vector &TestArgs, std::unique_ptr Program, - std::unique_ptr TM, const char *ToolName, + std::unique_ptr TM, StringRef ToolName, StringRef OutputFilename, bool InputIsBitcode, bool OutputBitcode); /// Runs the interesting-ness test for the specified file @@ -42,7 +42,7 @@ const TargetMachine *getTargetMachine() const { return TM.get(); } - const char *getToolName() const { return ToolName; } + StringRef getToolName() const { return ToolName; } void writeOutput(StringRef Message); @@ -52,7 +52,7 @@ private: StringRef TestName; - const char *ToolName; + StringRef ToolName; const std::vector &TestArgs; std::unique_ptr Program; std::unique_ptr TM; Index: llvm/tools/llvm-reduce/TestRunner.cpp =================================================================== --- llvm/tools/llvm-reduce/TestRunner.cpp +++ llvm/tools/llvm-reduce/TestRunner.cpp @@ -27,7 +27,7 @@ TestRunner::TestRunner(StringRef TestName, const std::vector &TestArgs, std::unique_ptr Program, - std::unique_ptr TM, const char *ToolName, + std::unique_ptr TM, StringRef ToolName, StringRef OutputName, bool InputIsBitcode, bool OutputBitcode) : TestName(TestName), ToolName(ToolName), TestArgs(TestArgs), Index: llvm/tools/llvm-reduce/deltas/Delta.cpp =================================================================== --- llvm/tools/llvm-reduce/deltas/Delta.cpp +++ llvm/tools/llvm-reduce/deltas/Delta.cpp @@ -63,7 +63,7 @@ void writeBitcode(ReducerWorkItem &M, raw_ostream &OutStream); void readBitcode(ReducerWorkItem &M, MemoryBufferRef Data, LLVMContext &Ctx, - const char *ToolName); + StringRef ToolName); bool isReduced(ReducerWorkItem &M, const TestRunner &Test, const std::atomic &Killed) { Index: llvm/tools/llvm-reduce/llvm-reduce.cpp =================================================================== --- llvm/tools/llvm-reduce/llvm-reduce.cpp +++ llvm/tools/llvm-reduce/llvm-reduce.cpp @@ -45,18 +45,19 @@ "debugging (crash reports, llvm-symbolizer and core dumps)"), cl::cat(LLVMReduceOptions)); +// FIXME: should be able to do this without other arguments, also add in help. static cl::opt PrintDeltaPasses("print-delta-passes", cl::desc("Print list of delta passes, passable to " "--delta-passes as a comma separated list"), cl::cat(LLVMReduceOptions)); -static cl::opt InputFilename(cl::Positional, cl::Required, +static cl::opt InputFilename(cl::Positional, cl::desc(""), cl::cat(LLVMReduceOptions)); static cl::opt - TestFilename("test", cl::Required, + TestFilename("test", cl::desc("Name of the interesting-ness test to be run"), cl::cat(LLVMReduceOptions)); @@ -138,7 +139,8 @@ return {OutputFilename, OutputBitcode}; } -void readBitcode(ReducerWorkItem &M, MemoryBufferRef Data, LLVMContext &Ctx, const char *ToolName) { +void readBitcode(ReducerWorkItem &M, MemoryBufferRef Data, LLVMContext &Ctx, + StringRef ToolName) { Expected IF = llvm::getBitcodeFileContents(Data); if (!IF) { WithColor::error(errs(), ToolName) << IF.takeError(); @@ -157,10 +159,21 @@ int main(int Argc, char **Argv) { InitLLVM X(Argc, Argv); + const StringRef ToolName(Argv[0]); cl::HideUnrelatedOptions({&LLVMReduceOptions, &getColorCategory()}); cl::ParseCommandLineOptions(Argc, Argv, "LLVM automatic testcase reducer.\n"); + if (Argc == 1) { + cl::PrintHelpMessage(); + return 0; + } + + if (PrintDeltaPasses) { + printDeltaPasses(outs()); + return 0; + } + bool ReduceModeMIR = false; if (InputLanguage != InputLanguages::None) { if (InputLanguage == InputLanguages::MIR) @@ -169,9 +182,15 @@ ReduceModeMIR = true; } - if (PrintDeltaPasses) { - printDeltaPasses(errs()); - return 0; + if (InputFilename.empty()) { + WithColor::error(errs(), ToolName) + << "reduction testcase positional argument must be specified\n"; + return 1; + } + + if (TestFilename.empty()) { + WithColor::error(errs(), ToolName) << "--test option must be specified\n"; + return 1; } if (!PreserveDebugEnvironment) @@ -181,7 +200,7 @@ std::unique_ptr TM; auto [OriginalProgram, InputIsBitcode] = - parseReducerWorkItem(Argv[0], InputFilename, Context, TM, ReduceModeMIR); + parseReducerWorkItem(ToolName, InputFilename, Context, TM, ReduceModeMIR); if (!OriginalProgram) { return 1; } @@ -193,7 +212,7 @@ // Initialize test environment TestRunner Tester(TestFilename, TestArguments, std::move(OriginalProgram), - std::move(TM), Argv[0], OutputFilename, InputIsBitcode, + std::move(TM), ToolName, OutputFilename, InputIsBitcode, OutputBitcode); // This parses and writes out the testcase into a temporary file copy for the