diff options
| author | Jordan Rupprecht <rupprecht@google.com> | 2019-02-12 20:00:51 +0000 |
|---|---|---|
| committer | Jordan Rupprecht <rupprecht@google.com> | 2019-02-12 20:00:51 +0000 |
| commit | 706a965295618cadbc1a27098f1a015590e7a392 (patch) | |
| tree | 85948d780330e3b37458696ab080b1452f47a7e4 | |
| parent | a3be17ea1cf0414ffd9744491ba22a6dd6157369 (diff) | |
| download | bcm5719-llvm-706a965295618cadbc1a27098f1a015590e7a392.tar.gz bcm5719-llvm-706a965295618cadbc1a27098f1a015590e7a392.zip | |
[llvm-dwp] Avoid writing the output dwp file when there is an error
Summary: Use ToolOutputFile to clean up the output file unless dwp actually finishes successfully.
Reviewers: dblaikie
Reviewed By: dblaikie
Subscribers: jdoerfert, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D58130
llvm-svn: 353873
| -rw-r--r-- | llvm/test/tools/llvm-dwp/X86/missing_dwo_id.test | 4 | ||||
| -rw-r--r-- | llvm/tools/llvm-dwp/llvm-dwp.cpp | 15 |
2 files changed, 13 insertions, 6 deletions
diff --git a/llvm/test/tools/llvm-dwp/X86/missing_dwo_id.test b/llvm/test/tools/llvm-dwp/X86/missing_dwo_id.test index a07bcb8fb9b..bb5eddccd22 100644 --- a/llvm/test/tools/llvm-dwp/X86/missing_dwo_id.test +++ b/llvm/test/tools/llvm-dwp/X86/missing_dwo_id.test @@ -1,3 +1,7 @@ +RUN: rm -f %t RUN: not llvm-dwp %p/../Inputs/missing_dwo_id.dwo -o %t 2>&1 | FileCheck %s +Make sure we did not leave behind a temporary file: +RUN: not ls %t + CHECK: error: {{.*}}missing_dwo_id.dwo': compile unit missing dwo_id diff --git a/llvm/tools/llvm-dwp/llvm-dwp.cpp b/llvm/tools/llvm-dwp/llvm-dwp.cpp index 87831a8f81f..f2fb3ba1479 100644 --- a/llvm/tools/llvm-dwp/llvm-dwp.cpp +++ b/llvm/tools/llvm-dwp/llvm-dwp.cpp @@ -39,6 +39,7 @@ #include "llvm/Support/Path.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/TargetSelect.h" +#include "llvm/Support/ToolOutputFile.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; @@ -700,23 +701,23 @@ int main(int argc, char **argv) { // Create the output file. std::error_code EC; - raw_fd_ostream OutFile(OutputFilename, EC, sys::fs::F_None); + ToolOutputFile OutFile(OutputFilename, EC, sys::fs::F_None); Optional<buffer_ostream> BOS; raw_pwrite_stream *OS; if (EC) return error(Twine(OutputFilename) + ": " + EC.message(), Context); - if (OutFile.supportsSeeking()) { - OS = &OutFile; + if (OutFile.os().supportsSeeking()) { + OS = &OutFile.os(); } else { - BOS.emplace(OutFile); + BOS.emplace(OutFile.os()); OS = BOS.getPointer(); } MCTargetOptions MCOptions = InitMCTargetOptionsFromFlags(); std::unique_ptr<MCStreamer> MS(TheTarget->createMCObjectStreamer( TheTriple, MC, std::unique_ptr<MCAsmBackend>(MAB), - MAB->createObjectWriter(*OS), std::unique_ptr<MCCodeEmitter>(MCE), - *MSTI, MCOptions.MCRelaxAll, MCOptions.MCIncrementalLinkerCompatible, + MAB->createObjectWriter(*OS), std::unique_ptr<MCCodeEmitter>(MCE), *MSTI, + MCOptions.MCRelaxAll, MCOptions.MCIncrementalLinkerCompatible, /*DWARFMustBeAtTheEnd*/ false)); if (!MS) return error("no object streamer for target " + TripleName, Context); @@ -739,4 +740,6 @@ int main(int argc, char **argv) { } MS->Finish(); + OutFile.keep(); + return 0; } |

