summaryrefslogtreecommitdiffstats
path: root/clang/tools/clang-cc/DependencyFile.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-05-03 09:35:25 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-05-03 09:35:25 +0000
commitf6d272f2418e0e1606316bed7a3182c19f8a210a (patch)
tree422ac22bcd8294795cfb3130e688bf594194fb10 /clang/tools/clang-cc/DependencyFile.cpp
parent61af27860d6042f9c92e357a74954b5b74d90fbc (diff)
downloadbcm5719-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.cpp47
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;
OpenPOWER on IntegriCloud