[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:
parent
189aba9305
commit
222a7bbf0d
@ -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.
|
||||
|
||||
@ -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);
|
||||
};
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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?
|
||||
|
||||
@ -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()) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user