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.

llvm-svn: 70687
This commit is contained in:
Daniel Dunbar 2009-05-03 10:04:17 +00:00
parent f6d272f241
commit d58929be46
4 changed files with 52 additions and 46 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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;