]> granicus.if.org Git - clang/commitdiff
Teach the driver about failure result files, which are compilation
authorPeter Collingbourne <peter@pcc.me.uk>
Mon, 21 Nov 2011 00:01:05 +0000 (00:01 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Mon, 21 Nov 2011 00:01:05 +0000 (00:01 +0000)
output files that are valid regardless of whether the compilation
succeeded or failed (but not if we crash).  Add depfiles to the
failure result file list.

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

include/clang/Driver/Compilation.h
lib/Driver/Driver.cpp
lib/Driver/Tools.cpp
test/Driver/crash-cleanup.c [deleted file]
test/Driver/output-file-cleanup.c [new file with mode: 0644]

index 8c9990909ebb006b4db113382fb5e9296cc3aa75..fd88c3a63636cf1631e9a7c63b64cf8d3e8233a9 100644 (file)
@@ -56,6 +56,10 @@ class Compilation {
   /// Result files which should be removed on failure.
   ArgStringList ResultFiles;
 
+  /// Result files which are generated correctly on failure, and which should
+  /// only be removed if we crash.
+  ArgStringList FailureResultFiles;
+
   /// Redirection for stdout, stderr, etc.
   const llvm::sys::Path **Redirects;
 
@@ -84,6 +88,10 @@ public:
 
   const ArgStringList &getResultFiles() const { return ResultFiles; }
 
+  const ArgStringList &getFailureResultFiles() const {
+    return FailureResultFiles;
+  }
+
   /// getArgsForToolChain - Return the derived argument list for the
   /// tool chain \arg TC (or the default tool chain, if TC is not
   /// specified).
@@ -106,6 +114,13 @@ public:
     return Name;
   }
 
+  /// addFailureResultFile - Add a file to remove if we crash, and returns its
+  /// argument.
+  const char *addFailureResultFile(const char *Name) {
+    FailureResultFiles.push_back(Name);
+    return Name;
+  }
+
   /// CleanupFileList - Remove the files in the given list.
   ///
   /// \param IssueErrors - Report failures as errors.
index feeeb049f55dec45e259a2a48c3a128dc855f692..086e3a411f35916fc6e7d59759008a5b74fb8684 100644 (file)
@@ -507,9 +507,14 @@ int Driver::ExecuteCompilation(const Compilation &C,
     return Res;
 
   // Otherwise, remove result files as well.
-  if (!C.getArgs().hasArg(options::OPT_save_temps))
+  if (!C.getArgs().hasArg(options::OPT_save_temps)) {
     C.CleanupFileList(C.getResultFiles(), true);
 
+    // Failure result files are valid unless we crashed.
+    if (Res < 0)
+      C.CleanupFileList(C.getFailureResultFiles(), true);
+  }
+
   // Print extra information about abnormal failures, if possible.
   //
   // This is ad-hoc, but we don't want to be excessively noisy. If the result
index 906f2ae0db7b5ec0973f96ac5ec16a6b867a849c..161001ccdbdcf7c7a2b06016348cce11514faab5 100644 (file)
@@ -218,11 +218,13 @@ void Clang::AddPreprocessingOptions(Compilation &C,
       DepFile = Output.getFilename();
     } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
       DepFile = MF->getValue(Args);
+      C.addFailureResultFile(DepFile);
     } else if (A->getOption().matches(options::OPT_M) ||
                A->getOption().matches(options::OPT_MM)) {
       DepFile = "-";
     } else {
       DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
+      C.addFailureResultFile(DepFile);
     }
     CmdArgs.push_back("-dependency-file");
     CmdArgs.push_back(DepFile);
diff --git a/test/Driver/crash-cleanup.c b/test/Driver/crash-cleanup.c
deleted file mode 100644 (file)
index b994bd8..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-// RUN: not %clang -o %t.o -MMD -MF %t.d %s
-// RUN: test ! -f %t.o
-// RUN: test ! -f %t.d
-// REQUIRES: shell
-// REQUIRES: crash-recovery
-
-// XFAIL: *
-
-#pragma clang __debug crash
diff --git a/test/Driver/output-file-cleanup.c b/test/Driver/output-file-cleanup.c
new file mode 100644 (file)
index 0000000..b4745e2
--- /dev/null
@@ -0,0 +1,20 @@
+// RUN: touch %t.o
+// RUN: not %clang -DCRASH -o %t.o -MMD -MF %t.d %s
+// RUN: test ! -f %t.o
+// RUN: test ! -f %t.d
+
+// RUN: touch %t.o
+// RUN: not %clang -o %t.o -MMD -MF %t.d %s
+// RUN: test ! -f %t.o
+// RUN: test -f %t.d
+
+// REQUIRES: shell
+// REQUIRES: crash-recovery
+
+// XFAIL: darwin
+
+#ifdef CRASH
+#pragma clang __debug crash
+#else
+invalid C code
+#endif