diff options
-rw-r--r-- | llvm/test/Reduce/remove-funcs.ll | 4 | ||||
-rw-r--r-- | llvm/test/Reduce/remove-global-vars.ll | 4 | ||||
-rw-r--r-- | llvm/test/Reduce/remove-metadata.ll | 4 | ||||
-rw-r--r-- | llvm/tools/llvm-reduce/TestRunner.cpp | 6 | ||||
-rw-r--r-- | llvm/tools/llvm-reduce/TestRunner.h | 9 | ||||
-rw-r--r-- | llvm/tools/llvm-reduce/deltas/Delta.cpp | 57 | ||||
-rw-r--r-- | llvm/tools/llvm-reduce/llvm-reduce.cpp | 13 |
7 files changed, 40 insertions, 57 deletions
diff --git a/llvm/test/Reduce/remove-funcs.ll b/llvm/test/Reduce/remove-funcs.ll index 2912a49157c..d8b493d819c 100644 --- a/llvm/test/Reduce/remove-funcs.ll +++ b/llvm/test/Reduce/remove-funcs.ll @@ -10,8 +10,8 @@ ; then include the rest of the test script ; RUN: cat %p/Inputs/remove-funcs.py >> %t/test.py -; UN: llvm-reduce --test %t/test.py %s -o %t/out.ll -; UN: cat %t/out.ll | FileCheck -implicit-check-not=uninteresting %s +; RUN: llvm-reduce --test %t/test.py %s -o %t/out.ll +; RUN: cat %t/out.ll | FileCheck -implicit-check-not=uninteresting %s ; REQUIRES: plugins define i32 @uninteresting1() { diff --git a/llvm/test/Reduce/remove-global-vars.ll b/llvm/test/Reduce/remove-global-vars.ll index 07308baa61a..d9fb997d837 100644 --- a/llvm/test/Reduce/remove-global-vars.ll +++ b/llvm/test/Reduce/remove-global-vars.ll @@ -10,8 +10,8 @@ ; then include the rest of the test script ; RUN: cat %p/Inputs/remove-global-vars.py >> %t/test.py -; UN: llvm-reduce --test %t/test.py %s -o %t/out.ll -; UN: cat %t/out.ll | FileCheck -implicit-check-not=uninteresting %s +; RUN: llvm-reduce --test %t/test.py %s -o %t/out.ll +; RUN: cat %t/out.ll | FileCheck -implicit-check-not=uninteresting %s ; REQUIRES: plugins ; CHECK: @interesting = global diff --git a/llvm/test/Reduce/remove-metadata.ll b/llvm/test/Reduce/remove-metadata.ll index 0413ef6b34a..aef2df0deab 100644 --- a/llvm/test/Reduce/remove-metadata.ll +++ b/llvm/test/Reduce/remove-metadata.ll @@ -10,8 +10,8 @@ ; then include the rest of the test script ; RUN: cat %p/Inputs/remove-metadata.py >> %t/test.py -; UN: llvm-reduce --test %t/test.py %s -o %t/out.ll -; UN: cat %t/out.ll | FileCheck -implicit-check-not=! %s +; RUN: llvm-reduce --test %t/test.py %s -o %t/out.ll +; RUN: cat %t/out.ll | FileCheck -implicit-check-not=! %s ; REQUIRES: plugins @global = global i32 0, !dbg !0 diff --git a/llvm/tools/llvm-reduce/TestRunner.cpp b/llvm/tools/llvm-reduce/TestRunner.cpp index 1940e426941..50b277b6f0e 100644 --- a/llvm/tools/llvm-reduce/TestRunner.cpp +++ b/llvm/tools/llvm-reduce/TestRunner.cpp @@ -26,10 +26,8 @@ static SmallString<128> initializeTmpDirectory() { return TmpDirectory; } -TestRunner::TestRunner(StringRef TestName, std::vector<std::string> TestArgs, - StringRef ReducedFilepath) - : TestName(TestName), TestArgs(std::move(TestArgs)), - ReducedFilepath(ReducedFilepath) { +TestRunner::TestRunner(StringRef TestName, std::vector<std::string> TestArgs) + : TestName(TestName), TestArgs(std::move(TestArgs)) { TmpDirectory = initializeTmpDirectory(); } diff --git a/llvm/tools/llvm-reduce/TestRunner.h b/llvm/tools/llvm-reduce/TestRunner.h index 4d5b5bb0375..35235e2adeb 100644 --- a/llvm/tools/llvm-reduce/TestRunner.h +++ b/llvm/tools/llvm-reduce/TestRunner.h @@ -24,29 +24,22 @@ namespace llvm { // respective filename. class TestRunner { public: - TestRunner(StringRef TestName, std::vector<std::string> TestArgs, - StringRef ReducedFilepath); + TestRunner(StringRef TestName, std::vector<std::string> TestArgs); /// Runs the interesting-ness test for the specified file /// @returns 0 if test was successful, 1 if otherwise int run(StringRef Filename); - /// Filename to the most reduced testcase - StringRef getReducedFilepath() const { return ReducedFilepath; } /// Directory where tmp files are created StringRef getTmpDir() const { return TmpDirectory; } /// Returns the most reduced version of the original testcase Module *getProgram() const { return Program.get(); } - void setReducedFilepath(SmallString<128> F) { - ReducedFilepath = std::move(F); - } void setProgram(std::unique_ptr<Module> P) { Program = std::move(P); } private: SmallString<128> TestName; std::vector<std::string> TestArgs; - SmallString<128> ReducedFilepath; SmallString<128> TmpDirectory; std::unique_ptr<Module> Program; }; diff --git a/llvm/tools/llvm-reduce/deltas/Delta.cpp b/llvm/tools/llvm-reduce/deltas/Delta.cpp index 45dac1769e3..0b5571f74de 100644 --- a/llvm/tools/llvm-reduce/deltas/Delta.cpp +++ b/llvm/tools/llvm-reduce/deltas/Delta.cpp @@ -21,39 +21,26 @@ using namespace llvm; -/// Writes IR code to the given Filepath -static bool writeProgramToFile(StringRef Filepath, int FD, const Module &M) { - ToolOutputFile Out(Filepath, FD); - M.print(Out.os(), /*AnnotationWriter=*/nullptr); - Out.os().close(); - - if (!Out.os().has_error()) { - Out.keep(); - return false; - } - return true; -} - -/// Creates a temporary (and unique) file inside the tmp folder and writes -/// the given module IR. -static SmallString<128> createTmpFile(Module *M, StringRef TmpDir) { - SmallString<128> UniqueFilepath; - int UniqueFD; - - SmallString<128> TmpFilepath; - sys::path::append(TmpFilepath, TmpDir, "tmp-%%%.ll"); +bool IsReduced(Module &M, TestRunner &Test, SmallString<128> &CurrentFilepath) { + // Write Module to tmp file + int FD; std::error_code EC = - sys::fs::createUniqueFile(TmpFilepath, UniqueFD, UniqueFilepath); + sys::fs::createTemporaryFile("llvm-reduce", "ll", FD, CurrentFilepath); if (EC) { errs() << "Error making unique filename: " << EC.message() << "!\n"; exit(1); } - if (writeProgramToFile(UniqueFilepath, UniqueFD, *M)) { - errs() << "Error emitting bitcode to file '" << UniqueFilepath << "'!\n"; + ToolOutputFile Out(CurrentFilepath, FD); + M.print(Out.os(), /*AnnotationWriter=*/nullptr); + Out.os().close(); + if (Out.os().has_error()) { + errs() << "Error emitting bitcode to file '" << CurrentFilepath << "'!\n"; exit(1); } - return UniqueFilepath; + + // Current Chunks aren't interesting + return Test.run(CurrentFilepath); } /// Counts the amount of lines for a given file @@ -108,9 +95,13 @@ void llvm::runDeltaPass( errs() << "\nNothing to reduce\n"; return; } - if (!Test.run(Test.getReducedFilepath())) { - errs() << "\nInput isn't interesting! Verify interesting-ness test\n"; - exit(1); + + if (Module *Program = Test.getProgram()) { + SmallString<128> CurrentFilepath; + if (!IsReduced(*Program, Test, CurrentFilepath)) { + errs() << "\nInput isn't interesting! Verify interesting-ness test\n"; + exit(1); + } } std::vector<Chunk> Chunks = {{1, Targets}}; @@ -138,25 +129,21 @@ void llvm::runDeltaPass( std::unique_ptr<Module> Clone = CloneModule(*Test.getProgram()); // Generate Module with only Targets inside Current Chunks ExtractChunksFromModule(CurrentChunks, Clone.get()); - // Write Module to tmp file - SmallString<128> CurrentFilepath = - createTmpFile(Clone.get(), Test.getTmpDir()); errs() << "Ignoring: "; Chunks[I].print(); for (auto C : UninterestingChunks) C.print(); - errs() << " | " << sys::path::filename(CurrentFilepath); - // Current Chunks aren't interesting - if (!Test.run(CurrentFilepath)) { + + SmallString<128> CurrentFilepath; + if (!IsReduced(*Clone, Test, CurrentFilepath)) { errs() << "\n"; continue; } UninterestingChunks.insert(Chunks[I]); - Test.setReducedFilepath(CurrentFilepath); ReducedProgram = std::move(Clone); errs() << " **** SUCCESS | lines: " << getLines(CurrentFilepath) << "\n"; } diff --git a/llvm/tools/llvm-reduce/llvm-reduce.cpp b/llvm/tools/llvm-reduce/llvm-reduce.cpp index 6836e1dbee4..83dcf980a78 100644 --- a/llvm/tools/llvm-reduce/llvm-reduce.cpp +++ b/llvm/tools/llvm-reduce/llvm-reduce.cpp @@ -81,14 +81,13 @@ int main(int argc, char **argv) { parseInputFile(InputFilename, Context); // Initialize test environment - TestRunner Tester(TestFilename, TestArguments, InputFilename); + TestRunner Tester(TestFilename, TestArguments); Tester.setProgram(std::move(OriginalProgram)); // Try to reduce code runDeltaPasses(Tester); - StringRef ReducedFilename = sys::path::filename(Tester.getReducedFilepath()); - if (ReducedFilename == sys::path::filename(InputFilename)) { + if (!Tester.getProgram()) { errs() << "\nCouldnt reduce input :/\n"; } else { // Print reduced file to STDOUT @@ -100,7 +99,13 @@ int main(int argc, char **argv) { else if (OutputFilename.empty()) OutputFilename = "reduced.ll"; - sys::fs::copy_file(Tester.getReducedFilepath(), OutputFilename); + std::error_code EC; + raw_fd_ostream Out(OutputFilename, EC); + if (EC) { + errs() << "Error opening output file: " << EC.message() << "!\n"; + exit(1); + } + Tester.getProgram()->print(Out, /*AnnotationWriter=*/nullptr); errs() << "\nDone reducing! Reduced testcase: " << OutputFilename << "\n"; } } |