]> granicus.if.org Git - llvm/commitdiff
[llvm-dwp] Avoid writing the output dwp file when there is an error
authorJordan Rupprecht <rupprecht@google.com>
Tue, 12 Feb 2019 20:00:51 +0000 (20:00 +0000)
committerJordan Rupprecht <rupprecht@google.com>
Tue, 12 Feb 2019 20:00:51 +0000 (20:00 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353873 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-dwp/X86/missing_dwo_id.test
tools/llvm-dwp/llvm-dwp.cpp

index a07bcb8fb9b36f86767fe78eed7bb53062ea09ad..bb5eddccd2272e47b703af372b88904d9dda95a3 100644 (file)
@@ -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
index 87831a8f81ff2d4cc69f38b938973f250640c088..f2fb3ba1479a02b1680a970d8f1d151b59d9b4f5 100644 (file)
@@ -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;
 }