]> granicus.if.org Git - clang/commitdiff
PR4063: Fix dependency generation with -E.
authorDaniel Dunbar <daniel@zuster.org>
Sun, 3 May 2009 09:35:25 +0000 (09:35 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sun, 3 May 2009 09:35:25 +0000 (09:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70686 91177308-0d34-0410-b5e6-96231b3b80d8

test/Preprocessor/depencies-and-pp.c [new file with mode: 0644]
tools/clang-cc/DependencyFile.cpp
tools/clang-cc/clang-cc.cpp

diff --git a/test/Preprocessor/depencies-and-pp.c b/test/Preprocessor/depencies-and-pp.c
new file mode 100644 (file)
index 0000000..ec66c73
--- /dev/null
@@ -0,0 +1,4 @@
+// RUN: clang -E -o %t.1 %s &&
+// RUN: clang -E -MD -MF %t.d -MT foo -o %t.2 %s &&
+// RUN: diff %t.1 %t.2 &&
+// RUN: grep "foo:" %t.d
index 34b6ecfcab8615fadadf68c4d3d21c3797c82336..9ef209eeebbb8050b489731eb39f9dab3b2e30df 100644 (file)
@@ -35,6 +35,10 @@ class VISIBILITY_HIDDEN DependencyFileCallback : public PPCallbacks {
   std::vector<std::string> Targets;
   llvm::raw_ostream *OS;
 
+  // FIXME: This functionality should be moved into a common class for
+  // chaining callbacks.
+  PPCallbacks *PrevCallbacks;
+
 private:
   bool FileMatchesDepCriteria(const char *Filename,
                               SrcMgr::CharacteristicKind FileType);
@@ -43,11 +47,14 @@ private:
 public:
   DependencyFileCallback(const Preprocessor *_PP, 
                          llvm::raw_ostream *_OS, 
-                         const std::vector<std::string> &_Targets)
-    : PP(_PP), Targets(_Targets), OS(_OS) {
+                         const std::vector<std::string> &_Targets,
+                         PPCallbacks *_PrevCallbacks)
+    : PP(_PP), Targets(_Targets), OS(_OS), PrevCallbacks(_PrevCallbacks) {
   }
 
   ~DependencyFileCallback() {
+    if (PrevCallbacks)
+      delete PrevCallbacks;
     OutputDependencyFile();
     OS->flush();
     delete OS;
@@ -55,6 +62,32 @@ public:
 
   virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason,
                            SrcMgr::CharacteristicKind FileType);
+
+  virtual void Ident(SourceLocation Loc, const std::string &str) {
+    if (PrevCallbacks)
+      PrevCallbacks->Ident(Loc, str);
+  }
+  
+  virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind, 
+                             const std::string &Str) {
+    if (PrevCallbacks)
+      PrevCallbacks->PragmaComment(Loc, Kind, Str);
+  }
+  
+  virtual void MacroExpands(const Token &Id, const MacroInfo* MI) {
+    if (PrevCallbacks)
+      PrevCallbacks->MacroExpands(Id, MI);
+  }
+  
+  virtual void MacroDefined(const IdentifierInfo *II, const MacroInfo *MI) {
+    if (PrevCallbacks)
+      PrevCallbacks->MacroDefined(II, MI);
+  }
+
+  virtual void MacroUndefined(const IdentifierInfo *II, const MacroInfo *MI) {
+    if (PrevCallbacks)
+      PrevCallbacks->MacroUndefined(II, MI);
+  }
 };
 }
 
@@ -102,8 +135,13 @@ bool clang::CreateDependencyFileGen(Preprocessor *PP,
     }
   }
 
+  // Claim any previous callbacks.
+  PPCallbacks *Prev = PP->getPPCallbacks();
+  if (Prev)
+    PP->setPPCallbacks(0);
+
   DependencyFileCallback *PPDep = 
-    new DependencyFileCallback(PP, OS, DependencyTargets);
+    new DependencyFileCallback(PP, OS, DependencyTargets, Prev);
   PP->setPPCallbacks(PPDep);
   return true;
 }
@@ -124,6 +162,9 @@ bool DependencyFileCallback::FileMatchesDepCriteria(const char *Filename,
 void DependencyFileCallback::FileChanged(SourceLocation Loc,
                                          FileChangeReason Reason,
                                          SrcMgr::CharacteristicKind FileType) {
+  if (PrevCallbacks)
+    PrevCallbacks->FileChanged(Loc, Reason, FileType);
+
   if (Reason != PPCallbacks::EnterFile)
     return;
   
index 2ef1087e5cdd03b431f30332023761bed60bbdd7..a8836887a70e7a4a46d275f8102cdebb4b10c638 100644 (file)
@@ -1385,14 +1385,11 @@ public:
     if (InitializePreprocessor(*PP, InFile, InitOpts))
       return 0;
 
-    /// FIXME: PP can only handle one callback
-    if (ProgAction != PrintPreprocessedInput) {
-      std::string ErrStr;
-      bool DFG = CreateDependencyFileGen(PP.get(), ErrStr);
-      if (!DFG && !ErrStr.empty()) {
-        fprintf(stderr, "%s", ErrStr.c_str());
-        return 0;
-      }
+    std::string ErrStr;
+    bool DFG = CreateDependencyFileGen(PP.get(), ErrStr);
+    if (!DFG && !ErrStr.empty()) {
+      fprintf(stderr, "%s", ErrStr.c_str());
+      return 0;
     }
 
     return PP.take();