diff options
author | David Blaikie <dblaikie@gmail.com> | 2019-09-12 00:31:57 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2019-09-12 00:31:57 +0000 |
commit | aaef97a55e4885e95c8528e6dc761a63323d19b3 (patch) | |
tree | 10b97fb8dd2c87133d4f3cdf6a52e12c92437367 /llvm/tools/llvm-reduce/deltas | |
parent | 635d383fad2baef4cb4b241c8dd31c91913c0f32 (diff) | |
download | bcm5719-llvm-aaef97a55e4885e95c8528e6dc761a63323d19b3.tar.gz bcm5719-llvm-aaef97a55e4885e95c8528e6dc761a63323d19b3.zip |
PR43278: llvm-reduce: Use temporary file names (and ToolOutputFile) rather than unique ones - to ensure they're cleaned up
This modifies the tool somewhat to only create files when about to run
the "interestingness" test, and delete them immediately after - this
means some more files will be created sometimes (when "double checking"
work - which should probably be fixed/avoided anyway).
This now creates temporary files, rather than only unique ones, and also
uses ToolOutputFile (without ever calling "keep") to ensure the files
are deleted as soon as the interestingness test is run.
llvm-svn: 371696
Diffstat (limited to 'llvm/tools/llvm-reduce/deltas')
-rw-r--r-- | llvm/tools/llvm-reduce/deltas/Delta.cpp | 57 |
1 files changed, 22 insertions, 35 deletions
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"; } |