[cfe-commits] r145019 - in /cfe/trunk: lib/Frontend/DependencyFile.cpp test/Driver/output-file-cleanup.c

Peter Collingbourne peter at pcc.me.uk
Sun Nov 20 16:01:14 PST 2011


Author: pcc
Date: Sun Nov 20 18:01:14 2011
New Revision: 145019

URL: http://llvm.org/viewvc/llvm-project?rev=145019&view=rev
Log:
Delete the depfile if we could not open a header file.  We cannot
generate any reasonable depfile if a header is missing.

Modified:
    cfe/trunk/lib/Frontend/DependencyFile.cpp
    cfe/trunk/test/Driver/output-file-cleanup.c

Modified: cfe/trunk/lib/Frontend/DependencyFile.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/DependencyFile.cpp?rev=145019&r1=145018&r2=145019&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/DependencyFile.cpp (original)
+++ cfe/trunk/lib/Frontend/DependencyFile.cpp Sun Nov 20 18:01:14 2011
@@ -31,11 +31,12 @@
   std::vector<std::string> Files;
   llvm::StringSet<> FilesSet;
   const Preprocessor *PP;
+  std::string OutputFile;
   std::vector<std::string> Targets;
-  raw_ostream *OS;
   bool IncludeSystemHeaders;
   bool PhonyTarget;
   bool AddMissingHeaderDeps;
+  bool SeenMissingHeader;
 private:
   bool FileMatchesDepCriteria(const char *Filename,
                               SrcMgr::CharacteristicKind FileType);
@@ -44,12 +45,12 @@
 
 public:
   DependencyFileCallback(const Preprocessor *_PP,
-                         raw_ostream *_OS,
                          const DependencyOutputOptions &Opts)
-    : PP(_PP), Targets(Opts.Targets), OS(_OS),
+    : PP(_PP), OutputFile(Opts.OutputFile), Targets(Opts.Targets),
       IncludeSystemHeaders(Opts.IncludeSystemHeaders),
       PhonyTarget(Opts.UsePhonyTargets),
-      AddMissingHeaderDeps(Opts.AddMissingHeaderDeps) {}
+      AddMissingHeaderDeps(Opts.AddMissingHeaderDeps),
+      SeenMissingHeader(false) {}
 
   virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason,
                            SrcMgr::CharacteristicKind FileType,
@@ -65,8 +66,6 @@
 
   virtual void EndOfMainFile() {
     OutputDependencyFile();
-    delete OS;
-    OS = 0;
   }
 };
 }
@@ -78,19 +77,11 @@
     return;
   }
 
-  std::string Err;
-  raw_ostream *OS(new llvm::raw_fd_ostream(Opts.OutputFile.c_str(), Err));
-  if (!Err.empty()) {
-    PP.getDiagnostics().Report(diag::err_fe_error_opening)
-      << Opts.OutputFile << Err;
-    return;
-  }
-
   // Disable the "file not found" diagnostic if the -MG option was given.
   if (Opts.AddMissingHeaderDeps)
     PP.SetSuppressIncludeNotFoundError(true);
 
-  PP.addPPCallbacks(new DependencyFileCallback(&PP, OS, Opts));
+  PP.addPPCallbacks(new DependencyFileCallback(&PP, Opts));
 }
 
 /// FileMatchesDepCriteria - Determine whether the given Filename should be
@@ -145,8 +136,12 @@
                                                 SourceLocation EndLoc,
                                                 StringRef SearchPath,
                                                 StringRef RelativePath) {
-  if (AddMissingHeaderDeps && !File)
-    AddFilename(FileName);
+  if (!File) {
+    if (AddMissingHeaderDeps)
+      AddFilename(FileName);
+    else
+      SeenMissingHeader = true;
+  }
 }
 
 void DependencyFileCallback::AddFilename(StringRef Filename) {
@@ -165,6 +160,19 @@
 }
 
 void DependencyFileCallback::OutputDependencyFile() {
+  if (SeenMissingHeader) {
+    llvm::sys::Path(OutputFile).eraseFromDisk();
+    return;
+  }
+
+  std::string Err;
+  llvm::raw_fd_ostream OS(OutputFile.c_str(), Err);
+  if (!Err.empty()) {
+    PP->getDiagnostics().Report(diag::err_fe_error_opening)
+      << OutputFile << Err;
+    return;
+  }
+
   // Write out the dependency targets, trying to avoid overly long
   // lines when possible. We try our best to emit exactly the same
   // dependency file as GCC (4.2), assuming the included files are the
@@ -179,16 +187,16 @@
       Columns += N;
     } else if (Columns + N + 2 > MaxColumns) {
       Columns = N + 2;
-      *OS << " \\\n  ";
+      OS << " \\\n  ";
     } else {
       Columns += N + 1;
-      *OS << ' ';
+      OS << ' ';
     }
     // Targets already quoted as needed.
-    *OS << *I;
+    OS << *I;
   }
 
-  *OS << ':';
+  OS << ':';
   Columns += 1;
 
   // Now add each dependency in the order it was seen, but avoiding
@@ -200,23 +208,23 @@
     // break the line on the next iteration.
     unsigned N = I->length();
     if (Columns + (N + 1) + 2 > MaxColumns) {
-      *OS << " \\\n ";
+      OS << " \\\n ";
       Columns = 2;
     }
-    *OS << ' ';
-    PrintFilename(*OS, *I);
+    OS << ' ';
+    PrintFilename(OS, *I);
     Columns += N + 1;
   }
-  *OS << '\n';
+  OS << '\n';
 
   // Create phony targets if requested.
   if (PhonyTarget && !Files.empty()) {
     // Skip the first entry, this is always the input file itself.
     for (std::vector<std::string>::iterator I = Files.begin() + 1,
            E = Files.end(); I != E; ++I) {
-      *OS << '\n';
-      PrintFilename(*OS, *I);
-      *OS << ":\n";
+      OS << '\n';
+      PrintFilename(OS, *I);
+      OS << ":\n";
     }
   }
 }

Modified: cfe/trunk/test/Driver/output-file-cleanup.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/output-file-cleanup.c?rev=145019&r1=145018&r2=145019&view=diff
==============================================================================
--- cfe/trunk/test/Driver/output-file-cleanup.c (original)
+++ cfe/trunk/test/Driver/output-file-cleanup.c Sun Nov 20 18:01:14 2011
@@ -4,6 +4,11 @@
 // RUN: test ! -f %t.d
 
 // RUN: touch %t.o
+// RUN: not %clang -DMISSING -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
@@ -15,6 +20,8 @@
 
 #ifdef CRASH
 #pragma clang __debug crash
+#elif defined(MISSING)
+#include "nonexistent.h"
 #else
 invalid C code
 #endif





More information about the cfe-commits mailing list