[Preprocessor] Enhance Ifdef/Ifndef/Defined preprocessor callbacks to also pass

a MacroInfo object if the identifier was a macro name.

llvm-svn: 169665
This commit is contained in:
Argyrios Kyrtzidis 2012-12-08 02:21:11 +00:00
parent 189aba9305
commit 222a7bbf0d
5 changed files with 38 additions and 21 deletions

View File

@ -199,7 +199,8 @@ public:
}
/// \brief Hook called whenever the 'defined' operator is seen.
virtual void Defined(const Token &MacroNameTok) {
/// \param MI The MacroInfo if the name was a macro, null otherwise.
virtual void Defined(const Token &MacroNameTok, const MacroInfo *MI) {
}
/// \brief Hook called when a source range is skipped.
@ -228,13 +229,17 @@ public:
/// \brief Hook called whenever an \#ifdef is seen.
/// \param Loc the source location of the directive.
/// \param MacroNameTok Information on the token being tested.
virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok) {
/// \param MI The MacroInfo if the name was a macro, null otherwise.
virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok,
const MacroInfo *MI) {
}
/// \brief Hook called whenever an \#ifndef is seen.
/// \param Loc the source location of the directive.
/// \param MacroNameTok Information on the token being tested.
virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok) {
/// \param MI The MacroInfo if the name was a macro, null otherwise.
virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok,
const MacroInfo *MI) {
}
/// \brief Hook called whenever an \#else is seen.
@ -362,9 +367,9 @@ public:
Second->MacroUndefined(MacroNameTok, MI);
}
virtual void Defined(const Token &MacroNameTok) {
First->Defined(MacroNameTok);
Second->Defined(MacroNameTok);
virtual void Defined(const Token &MacroNameTok, const MacroInfo *MI) {
First->Defined(MacroNameTok, MI);
Second->Defined(MacroNameTok, MI);
}
virtual void SourceRangeSkipped(SourceRange Range) {
@ -386,15 +391,17 @@ public:
}
/// \brief Hook called whenever an \#ifdef is seen.
virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok) {
First->Ifdef(Loc, MacroNameTok);
Second->Ifdef(Loc, MacroNameTok);
virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok,
const MacroInfo *MI) {
First->Ifdef(Loc, MacroNameTok, MI);
Second->Ifdef(Loc, MacroNameTok, MI);
}
/// \brief Hook called whenever an \#ifndef is seen.
virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok) {
First->Ifndef(Loc, MacroNameTok);
Second->Ifndef(Loc, MacroNameTok);
virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok,
const MacroInfo *MI) {
First->Ifndef(Loc, MacroNameTok, MI);
Second->Ifndef(Loc, MacroNameTok, MI);
}
/// \brief Hook called whenever an \#else is seen.

View File

@ -89,8 +89,10 @@ private:
virtual void If(SourceLocation Loc, SourceRange ConditionRange);
virtual void Elif(SourceLocation Loc, SourceRange ConditionRange,
SourceLocation IfLoc);
virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok);
virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok);
virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok,
const MacroInfo *MI);
virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok,
const MacroInfo *MI);
virtual void Else(SourceLocation Loc, SourceLocation IfLoc);
virtual void Endif(SourceLocation Loc, SourceLocation IfLoc);
};

View File

@ -82,13 +82,15 @@ void PPConditionalDirectiveRecord::If(SourceLocation Loc,
}
void PPConditionalDirectiveRecord::Ifdef(SourceLocation Loc,
const Token &MacroNameTok) {
const Token &MacroNameTok,
const MacroInfo *MI) {
addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));
CondDirectiveStack.push_back(Loc);
}
void PPConditionalDirectiveRecord::Ifndef(SourceLocation Loc,
const Token &MacroNameTok) {
const Token &MacroNameTok,
const MacroInfo *MI) {
addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));
CondDirectiveStack.push_back(Loc);
}

View File

@ -2047,9 +2047,9 @@ void Preprocessor::HandleIfdefDirective(Token &Result, bool isIfndef,
if (Callbacks) {
if (isIfndef)
Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok);
Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MI);
else
Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok);
Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok, MI);
}
// Should we include the stuff contained by this directive?

View File

@ -111,15 +111,21 @@ static bool EvaluateDefined(PPValue &Result, Token &PeekTok, DefinedTracker &DT,
Result.Val = II->hasMacroDefinition();
Result.Val.setIsUnsigned(false); // Result is signed intmax_t.
MacroInfo *Macro = 0;
// If there is a macro, mark it used.
if (Result.Val != 0 && ValueLive) {
MacroInfo *Macro = PP.getMacroInfo(II);
Macro = PP.getMacroInfo(II);
PP.markMacroAsUsed(Macro);
}
// Invoke the 'defined' callback.
if (PPCallbacks *Callbacks = PP.getPPCallbacks())
Callbacks->Defined(PeekTok);
if (PPCallbacks *Callbacks = PP.getPPCallbacks()) {
MacroInfo *MI = Macro;
// Pass the MacroInfo for the macro name even if the value is dead.
if (!MI && Result.Val != 0)
MI = PP.getMacroInfo(II);
Callbacks->Defined(PeekTok, MI);
}
// If we are in parens, ensure we have a trailing ).
if (LParenLoc.isValid()) {