diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-05-03 10:04:17 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-05-03 10:04:17 +0000 |
commit | e5393fb93eb879d9ebbef102ae9311fa77e023cc (patch) | |
tree | 09c13d23b4dbb4efbd42c66730f19821154559d1 | |
parent | 0a70c64b090ea8b34db1b2764a46f9c364193a7a (diff) |
PR4063, with feeling: Chain PP callbacks by default.
- This is somewhat cleaner and also fixes PR4063 for real, I had the
order wrong so we were just creating an empty dependency file.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70687 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Lex/PPCallbacks.h | 45 | ||||
-rw-r--r-- | include/clang/Lex/Preprocessor.h | 3 | ||||
-rw-r--r-- | test/Preprocessor/dependencies-and-pp.c (renamed from test/Preprocessor/depencies-and-pp.c) | 3 | ||||
-rw-r--r-- | tools/clang-cc/DependencyFile.cpp | 47 |
4 files changed, 52 insertions, 46 deletions
diff --git a/include/clang/Lex/PPCallbacks.h b/include/clang/Lex/PPCallbacks.h index ddd7415c29..ec29eec13a 100644 --- a/include/clang/Lex/PPCallbacks.h +++ b/include/clang/Lex/PPCallbacks.h @@ -71,6 +71,51 @@ public: } }; +/// PPChainedCallbacks - Simple wrapper class for chaining callbacks. +class PPChainedCallbacks : public PPCallbacks { + PPCallbacks *First, *Second; + +public: + PPChainedCallbacks(PPCallbacks *_First, PPCallbacks *_Second) + : First(_First), Second(_Second) {} + ~PPChainedCallbacks() { + delete Second; + delete First; + } + + virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason, + SrcMgr::CharacteristicKind FileType) { + First->FileChanged(Loc, Reason, FileType); + Second->FileChanged(Loc, Reason, FileType); + } + + virtual void Ident(SourceLocation Loc, const std::string &str) { + First->Ident(Loc, str); + Second->Ident(Loc, str); + } + + virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind, + const std::string &Str) { + First->PragmaComment(Loc, Kind, Str); + Second->PragmaComment(Loc, Kind, Str); + } + + virtual void MacroExpands(const Token &Id, const MacroInfo* MI) { + First->MacroExpands(Id, MI); + Second->MacroExpands(Id, MI); + } + + virtual void MacroDefined(const IdentifierInfo *II, const MacroInfo *MI) { + First->MacroDefined(II, MI); + Second->MacroDefined(II, MI); + } + + virtual void MacroUndefined(const IdentifierInfo *II, const MacroInfo *MI) { + First->MacroUndefined(II, MI); + Second->MacroUndefined(II, MI); + } +}; + } // end namespace clang #endif diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index 2184acf0e3..5b9959c32a 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -241,7 +241,8 @@ public: /// it. PPCallbacks *getPPCallbacks() const { return Callbacks; } void setPPCallbacks(PPCallbacks *C) { - delete Callbacks; + if (Callbacks) + C = new PPChainedCallbacks(C, Callbacks); Callbacks = C; } diff --git a/test/Preprocessor/depencies-and-pp.c b/test/Preprocessor/dependencies-and-pp.c index ec66c73f75..1dc4d026b1 100644 --- a/test/Preprocessor/depencies-and-pp.c +++ b/test/Preprocessor/dependencies-and-pp.c @@ -1,4 +1,5 @@ // 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 +// RUN: grep "foo:" %t.d && +// RUN: grep "dependencies-and-pp.c" %t.d diff --git a/tools/clang-cc/DependencyFile.cpp b/tools/clang-cc/DependencyFile.cpp index 9ef209eeeb..34b6ecfcab 100644 --- a/tools/clang-cc/DependencyFile.cpp +++ b/tools/clang-cc/DependencyFile.cpp @@ -35,10 +35,6 @@ 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); @@ -47,14 +43,11 @@ private: public: DependencyFileCallback(const Preprocessor *_PP, llvm::raw_ostream *_OS, - const std::vector<std::string> &_Targets, - PPCallbacks *_PrevCallbacks) - : PP(_PP), Targets(_Targets), OS(_OS), PrevCallbacks(_PrevCallbacks) { + const std::vector<std::string> &_Targets) + : PP(_PP), Targets(_Targets), OS(_OS) { } ~DependencyFileCallback() { - if (PrevCallbacks) - delete PrevCallbacks; OutputDependencyFile(); OS->flush(); delete OS; @@ -62,32 +55,6 @@ 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); - } }; } @@ -135,13 +102,8 @@ 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, Prev); + new DependencyFileCallback(PP, OS, DependencyTargets); PP->setPPCallbacks(PPDep); return true; } @@ -162,9 +124,6 @@ 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; |