diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2009-05-03 09:35:25 +0000 |
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2009-05-03 09:35:25 +0000 |
| commit | f6d272f2418e0e1606316bed7a3182c19f8a210a (patch) | |
| tree | 422ac22bcd8294795cfb3130e688bf594194fb10 /clang/tools/clang-cc/DependencyFile.cpp | |
| parent | 61af27860d6042f9c92e357a74954b5b74d90fbc (diff) | |
| download | bcm5719-llvm-f6d272f2418e0e1606316bed7a3182c19f8a210a.tar.gz bcm5719-llvm-f6d272f2418e0e1606316bed7a3182c19f8a210a.zip | |
PR4063: Fix dependency generation with -E.
llvm-svn: 70686
Diffstat (limited to 'clang/tools/clang-cc/DependencyFile.cpp')
| -rw-r--r-- | clang/tools/clang-cc/DependencyFile.cpp | 47 |
1 files changed, 44 insertions, 3 deletions
diff --git a/clang/tools/clang-cc/DependencyFile.cpp b/clang/tools/clang-cc/DependencyFile.cpp index 34b6ecfcab8..9ef209eeebb 100644 --- a/clang/tools/clang-cc/DependencyFile.cpp +++ b/clang/tools/clang-cc/DependencyFile.cpp @@ -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; |

