; 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()
if (Result < 0) {
Error E = make_error<StringError>("Error running interesting-ness test\n",
inconvertibleErrorCode());
- outs() << toString(std::move(E));
+ errs() << toString(std::move(E));
exit(1);
}
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<Chunk> 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;
/// Splits Chunks in half and prints them.
/// If unable to split (when chunk size is 1) returns false.
static bool increaseGranularity(std::vector<Chunk> &Chunks) {
- outs() << "Increasing granularity...";
+ errs() << "Increasing granularity...";
std::vector<Chunk> NewChunks;
bool SplitOne = false;
}
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;
}
std::function<void(const std::vector<Chunk> &, 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);
}
std::unique_ptr<Module> ReducedProgram;
if (!increaseGranularity(Chunks)) {
- outs() << "\nAlready at minimum size. Cannot reduce anymore.\n";
+ errs() << "\nAlready at minimum size. Cannot reduce anymore.\n";
return;
}
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) {
// 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
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
/// 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
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;