Index: llvm/trunk/test/Reduce/remove-funcs.ll =================================================================== --- llvm/trunk/test/Reduce/remove-funcs.ll +++ llvm/trunk/test/Reduce/remove-funcs.ll @@ -1,8 +1,7 @@ ; Test that llvm-reduce can remove uninteresting functions as well as ; their InstCalls. ; -; RUN: llvm-reduce --test %p/Inputs/remove-funcs.py %s -; RUN: cat reduced.ll | FileCheck %s +; RUN: llvm-reduce --test %p/Inputs/remove-funcs.py %s -o - | FileCheck %s ; REQUIRES: plugins, shell ; CHECK-NOT: uninteresting1() Index: llvm/trunk/tools/llvm-reduce/TestRunner.cpp =================================================================== --- llvm/trunk/tools/llvm-reduce/TestRunner.cpp +++ llvm/trunk/tools/llvm-reduce/TestRunner.cpp @@ -49,7 +49,7 @@ if (Result < 0) { Error E = make_error("Error running interesting-ness test\n", inconvertibleErrorCode()); - outs() << toString(std::move(E)); + errs() << toString(std::move(E)); exit(1); } Index: llvm/trunk/tools/llvm-reduce/deltas/Delta.h =================================================================== --- llvm/trunk/tools/llvm-reduce/deltas/Delta.h +++ llvm/trunk/tools/llvm-reduce/deltas/Delta.h @@ -36,10 +36,10 @@ bool contains(unsigned Index) const { return Index >= begin && Index <= end; } void print() const { - outs() << "[" << begin; + errs() << "[" << begin; if (end - begin != 0) - outs() << "," << end; - outs() << "]"; + errs() << "," << end; + errs() << "]"; } /// Operator when populating CurrentChunks in Generic Delta Pass Index: llvm/trunk/tools/llvm-reduce/deltas/Delta.cpp =================================================================== --- llvm/trunk/tools/llvm-reduce/deltas/Delta.cpp +++ llvm/trunk/tools/llvm-reduce/deltas/Delta.cpp @@ -50,23 +50,6 @@ return UniqueFilepath; } -/// Prints the Chunk Indexes with the following format: [start, end], if -/// chunk is at minimum size (1), then it just displays [start]. -static void printChunks(std::vector Chunks, bool Oneline = false) { - if (Chunks.empty()) { - outs() << "No Chunks"; - return; - } - - for (auto C : Chunks) { - if (!Oneline) - outs() << '\t'; - C.print(); - if (!Oneline) - outs() << '\n'; - } -} - /// Counts the amount of lines for a given file static unsigned getLines(StringRef Filepath) { unsigned Lines = 0; @@ -82,7 +65,7 @@ /// Splits Chunks in half and prints them. /// If unable to split (when chunk size is 1) returns false. static bool increaseGranularity(std::vector &Chunks) { - outs() << "Increasing granularity..."; + errs() << "Increasing granularity..."; std::vector NewChunks; bool SplitOne = false; @@ -98,8 +81,12 @@ } if (SplitOne) { Chunks = NewChunks; - outs() << "Success! New Chunks:\n"; - printChunks(Chunks); + errs() << "Success! New Chunks:\n"; + for (auto C : Chunks) { + errs() << '\t'; + C.print(); + errs() << '\n'; + } } return SplitOne; } @@ -112,11 +99,11 @@ std::function &, Module *)> ExtractChunksFromModule) { if (!Targets) { - outs() << "\nNothing to reduce\n"; + errs() << "\nNothing to reduce\n"; return; } if (!Test.run(Test.getReducedFilepath())) { - outs() << "\nInput isn't interesting! Verify interesting-ness test\n"; + errs() << "\nInput isn't interesting! Verify interesting-ness test\n"; exit(1); } @@ -125,7 +112,7 @@ std::unique_ptr ReducedProgram; if (!increaseGranularity(Chunks)) { - outs() << "\nAlready at minimum size. Cannot reduce anymore.\n"; + errs() << "\nAlready at minimum size. Cannot reduce anymore.\n"; return; } @@ -149,20 +136,23 @@ SmallString<128> CurrentFilepath = createTmpFile(Clone.get(), Test.getTmpDir()); - outs() << "Testing with: "; - printChunks(CurrentChunks, /*Oneline=*/true); - outs() << " | " << sys::path::filename(CurrentFilepath); + 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)) { - outs() << "\n"; + errs() << "\n"; continue; } UninterestingChunks.insert(Chunks[I]); Test.setReducedFilepath(CurrentFilepath); ReducedProgram = std::move(Clone); - outs() << " **** SUCCESS | lines: " << getLines(CurrentFilepath) << "\n"; + errs() << " **** SUCCESS | lines: " << getLines(CurrentFilepath) << "\n"; } // Delete uninteresting chunks erase_if(Chunks, [&UninterestingChunks](const Chunk &C) { @@ -174,5 +164,5 @@ // If we reduced the testcase replace it if (ReducedProgram) Test.setProgram(std::move(ReducedProgram)); - outs() << "Couldn't increase anymore.\n"; + errs() << "Couldn't increase anymore.\n"; } \ No newline at end of file Index: llvm/trunk/tools/llvm-reduce/deltas/ReduceFunctions.cpp =================================================================== --- llvm/trunk/tools/llvm-reduce/deltas/ReduceFunctions.cpp +++ llvm/trunk/tools/llvm-reduce/deltas/ReduceFunctions.cpp @@ -54,19 +54,19 @@ /// respective name & index static unsigned countFunctions(Module *Program) { // TODO: Silence index with --quiet flag - outs() << "----------------------------\n"; - outs() << "Function Index Reference:\n"; + errs() << "----------------------------\n"; + errs() << "Function Index Reference:\n"; unsigned FunctionCount = 0; for (auto &F : *Program) - outs() << "\t" << ++FunctionCount << ": " << F.getName() << "\n"; + errs() << "\t" << ++FunctionCount << ": " << F.getName() << "\n"; - outs() << "----------------------------\n"; + errs() << "----------------------------\n"; return FunctionCount; } void llvm::reduceFunctionsDeltaPass(TestRunner &Test) { - outs() << "*** Reducing Functions...\n"; + errs() << "*** Reducing Functions...\n"; unsigned Functions = countFunctions(Test.getProgram()); runDeltaPass(Test, Functions, extractFunctionsFromModule); - outs() << "----------------------------\n"; + errs() << "----------------------------\n"; } \ No newline at end of file Index: llvm/trunk/tools/llvm-reduce/llvm-reduce.cpp =================================================================== --- llvm/trunk/tools/llvm-reduce/llvm-reduce.cpp +++ llvm/trunk/tools/llvm-reduce/llvm-reduce.cpp @@ -89,17 +89,22 @@ StringRef ReducedFilename = sys::path::filename(Tester.getReducedFilepath()); if (ReducedFilename == sys::path::filename(InputFilename)) { - outs() << "\nCouldnt reduce input :/\n"; + errs() << "\nCouldnt reduce input :/\n"; } else { - if (ReplaceInput) // In-place - OutputFilename = InputFilename.c_str(); - else if (OutputFilename.empty()) - OutputFilename = "reduced.ll"; - else - OutputFilename += ".ll"; - - sys::fs::copy_file(Tester.getReducedFilepath(), OutputFilename); - outs() << "\nDone reducing! Reduced IR to file: " << OutputFilename << "\n"; + // Print reduced file to STDOUT + if (OutputFilename == "-") + Tester.getProgram()->print(outs(), nullptr); + else { + if (ReplaceInput) // In-place + OutputFilename = InputFilename.c_str(); + else if (OutputFilename.empty()) + OutputFilename = "reduced.ll"; + else + OutputFilename += ".ll"; + + sys::fs::copy_file(Tester.getReducedFilepath(), OutputFilename); + errs() << "\nDone reducing! Reduced testcase: " << OutputFilename << "\n"; + } } return 0;