Driver: Cleanup temporary/result files.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67248 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Driver/Compilation.cpp b/lib/Driver/Compilation.cpp
index 364f328..0bd5738 100644
--- a/lib/Driver/Compilation.cpp
+++ b/lib/Driver/Compilation.cpp
@@ -11,14 +11,19 @@
 
 #include "clang/Driver/Action.h"
 #include "clang/Driver/ArgList.h"
+#include "clang/Driver/Driver.h"
+#include "clang/Driver/DriverDiagnostic.h"
 #include "clang/Driver/ToolChain.h"
 
 #include "llvm/Support/raw_ostream.h"
+#include <sys/stat.h>
+#include <errno.h>
 using namespace clang::driver;
 
-Compilation::Compilation(ToolChain &_DefaultToolChain,
+Compilation::Compilation(Driver &D,
+                         ToolChain &_DefaultToolChain,
                          ArgList *_Args) 
-  : DefaultToolChain(_DefaultToolChain), Args(_Args) {
+  : TheDriver(D), DefaultToolChain(_DefaultToolChain), Args(_Args) {
 }
 
 Compilation::~Compilation() {  
@@ -69,12 +74,51 @@
   }
 }
 
+bool Compilation::CleanupFileList(const ArgStringList &Files, 
+                                  bool IssueErrors) const {
+  bool Success = true;
+
+  for (ArgStringList::const_iterator 
+         it = Files.begin(), ie = Files.end(); it != ie; ++it) {
+    llvm::sys::Path P(*it);
+    std::string Error;
+
+    if (P.eraseFromDisk(false, &Error)) {
+      // Failure is only failure if the file doesn't exist. There is a
+      // race condition here due to the limited interface of
+      // llvm::sys::Path, we want to know if the removal gave E_NOENT.
+
+      // FIXME: Grumble, P.exists() is broken. PR3837.
+      struct stat buf;
+      if (::stat(P.c_str(), &buf) || errno != ENOENT) {
+        if (IssueErrors)
+          getDriver().Diag(clang::diag::err_drv_unable_to_remove_file)
+            << Error;
+        Success = false;
+      }
+    }
+  }
+
+  return Success;
+}
+
 int Compilation::Execute() const {
   // Just print if -### was present.
   if (getArgs().hasArg(options::OPT__HASH_HASH_HASH)) {
     PrintJob(llvm::errs(), &Jobs, "\n");
     return 0;
   }
+
+  // FIXME: Execute.
+
+  int Res = 0;
   
+  // Remove temp files.
+  CleanupFileList(TempFiles);
+
+  // If the compilation failed, remove result files as well.
+  if (Res != 0)
+    CleanupFileList(ResultFiles, true);
+
   return 0;
 }
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp
index 85debe8..e9e7511 100644
--- a/lib/Driver/Driver.cpp
+++ b/lib/Driver/Driver.cpp
@@ -165,7 +165,7 @@
   Host = GetHostInfo(HostTriple);
 
   // The compilation takes ownership of Args.
-  Compilation *C = new Compilation(*Host->getToolChain(*Args), Args);
+  Compilation *C = new Compilation(*this, *Host->getToolChain(*Args), Args);
 
   // FIXME: This behavior shouldn't be here.
   if (CCCPrintOptions) {