diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-02-24 00:05:14 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-02-24 00:05:14 +0000 |
commit | c515978bd3a703aa733f846a0094ffa84d149074 (patch) | |
tree | 575f1660e68d74b4268c6a1460f2fbb4245da518 /lib/Lex | |
parent | 82a29af8cbc4b117af83c5c5dfa875b5699c97c4 (diff) |
[preprocessor] Use MacroDirective in the preprocessor callbacks to make available the
full information about the macro (e.g if it was imported and where).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@175978 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex')
-rw-r--r-- | lib/Lex/PPConditionalDirectiveRecord.cpp | 4 | ||||
-rw-r--r-- | lib/Lex/PPDirectives.cpp | 13 | ||||
-rw-r--r-- | lib/Lex/PPExpressions.cpp | 14 | ||||
-rw-r--r-- | lib/Lex/PPMacroExpansion.cpp | 22 | ||||
-rw-r--r-- | lib/Lex/PreprocessingRecord.cpp | 31 | ||||
-rw-r--r-- | lib/Lex/Preprocessor.cpp | 5 |
6 files changed, 48 insertions, 41 deletions
diff --git a/lib/Lex/PPConditionalDirectiveRecord.cpp b/lib/Lex/PPConditionalDirectiveRecord.cpp index 063c556b4a..16ce3efb04 100644 --- a/lib/Lex/PPConditionalDirectiveRecord.cpp +++ b/lib/Lex/PPConditionalDirectiveRecord.cpp @@ -83,14 +83,14 @@ void PPConditionalDirectiveRecord::If(SourceLocation Loc, void PPConditionalDirectiveRecord::Ifdef(SourceLocation Loc, const Token &MacroNameTok, - const MacroInfo *MI) { + const MacroDirective *MD) { addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back())); CondDirectiveStack.push_back(Loc); } void PPConditionalDirectiveRecord::Ifndef(SourceLocation Loc, const Token &MacroNameTok, - const MacroInfo *MI) { + const MacroDirective *MD) { addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back())); CondDirectiveStack.push_back(Loc); } diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index 1044683212..07f24c8200 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -1938,7 +1938,7 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) { WarnUnusedMacroLocs.erase(OtherMI->getDefinitionLoc()); } - setMacroDirective(MacroNameTok.getIdentifierInfo(), MI); + MacroDirective *MD = setMacroDirective(MacroNameTok.getIdentifierInfo(), MI); assert(!MI->isUsed()); // If we need warning for not using the macro, add its location in the @@ -1952,7 +1952,7 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) { // If the callbacks want to know, tell them about the macro definition. if (Callbacks) - Callbacks->MacroDefined(MacroNameTok, MI); + Callbacks->MacroDefined(MacroNameTok, MD); } /// HandleUndefDirective - Implements \#undef. @@ -1977,7 +1977,7 @@ void Preprocessor::HandleUndefDirective(Token &UndefTok) { // If the callbacks want to know, tell them about the macro #undef. // Note: no matter if the macro was defined or not. if (Callbacks) - Callbacks->MacroUndefined(MacroNameTok, MI); + Callbacks->MacroUndefined(MacroNameTok, MD); // If the macro is not defined, this is a noop undef, just return. if (MI == 0) return; @@ -2035,7 +2035,8 @@ void Preprocessor::HandleIfdefDirective(Token &Result, bool isIfndef, CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef"); IdentifierInfo *MII = MacroNameTok.getIdentifierInfo(); - MacroInfo *MI = getMacroInfo(MII); + MacroDirective *MD = getMacroDirective(MII); + MacroInfo *MI = MD ? MD->getInfo() : 0; if (CurPPLexer->getConditionalStackDepth() == 0) { // If the start of a top-level #ifdef and if the macro is not defined, @@ -2055,9 +2056,9 @@ void Preprocessor::HandleIfdefDirective(Token &Result, bool isIfndef, if (Callbacks) { if (isIfndef) - Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MI); + Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MD); else - Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok, MI); + Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok, MD); } // Should we include the stuff contained by this directive? diff --git a/lib/Lex/PPExpressions.cpp b/lib/Lex/PPExpressions.cpp index 7ebf3e0072..49f4cbf71a 100644 --- a/lib/Lex/PPExpressions.cpp +++ b/lib/Lex/PPExpressions.cpp @@ -111,20 +111,20 @@ 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; + MacroDirective *Macro = 0; // If there is a macro, mark it used. if (Result.Val != 0 && ValueLive) { - Macro = PP.getMacroInfo(II); - PP.markMacroAsUsed(Macro); + Macro = PP.getMacroDirective(II); + PP.markMacroAsUsed(Macro->getInfo()); } // Invoke the 'defined' callback. if (PPCallbacks *Callbacks = PP.getPPCallbacks()) { - MacroInfo *MI = Macro; + MacroDirective *MD = 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 (!MD && Result.Val != 0) + MD = PP.getMacroDirective(II); + Callbacks->Defined(PeekTok, MD); } // If we are in parens, ensure we have a trailing ). diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index 99ab1346c0..8e54f019ba 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/lib/Lex/PPMacroExpansion.cpp @@ -41,10 +41,10 @@ Preprocessor::getMacroDirectiveHistory(const IdentifierInfo *II) const { return Pos->second; } -/// setMacroInfo - Specify a macro for this identifier. -/// -void Preprocessor::setMacroDirective(IdentifierInfo *II, MacroInfo *MI, - SourceLocation Loc, bool isImported) { +/// \brief Specify a macro for this identifier. +MacroDirective * +Preprocessor::setMacroDirective(IdentifierInfo *II, MacroInfo *MI, + SourceLocation Loc, bool isImported) { assert(MI && "MacroInfo should be non-zero!"); MacroDirective *MD = AllocateMacroDirective(MI, Loc, isImported); @@ -54,6 +54,8 @@ void Preprocessor::setMacroDirective(IdentifierInfo *II, MacroInfo *MI, II->setHasMacroDefinition(true); if (II->isFromAST()) II->setChangedSinceDeserialization(); + + return MD; } void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroDirective *MD, @@ -304,7 +306,9 @@ bool Preprocessor::isNextPPTokenLParen() { /// HandleMacroExpandedIdentifier - If an identifier token is read that is to be /// expanded as a macro, handle it and return the next token as 'Identifier'. bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier, - MacroInfo *MI) { + MacroDirective *MD) { + MacroInfo *MI = MD->getInfo(); + // If this is a macro expansion in the "#if !defined(x)" line for the file, // then the macro could expand to different things in other contexts, we need // to disable the optimization in this case. @@ -312,7 +316,7 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier, // If this is a builtin macro, like __LINE__ or _Pragma, handle it specially. if (MI->isBuiltinMacro()) { - if (Callbacks) Callbacks->MacroExpands(Identifier, MI, + if (Callbacks) Callbacks->MacroExpands(Identifier, MD, Identifier.getLocation()); ExpandBuiltinMacro(Identifier); return false; @@ -365,13 +369,13 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier, // MacroExpands callbacks still happen in source order, queue this // callback to have it happen after the function macro callback. DelayedMacroExpandsCallbacks.push_back( - MacroExpandsInfo(Identifier, MI, ExpansionRange)); + MacroExpandsInfo(Identifier, MD, ExpansionRange)); } else { - Callbacks->MacroExpands(Identifier, MI, ExpansionRange); + Callbacks->MacroExpands(Identifier, MD, ExpansionRange); if (!DelayedMacroExpandsCallbacks.empty()) { for (unsigned i=0, e = DelayedMacroExpandsCallbacks.size(); i!=e; ++i) { MacroExpandsInfo &Info = DelayedMacroExpandsCallbacks[i]; - Callbacks->MacroExpands(Info.Tok, Info.MI, Info.Range); + Callbacks->MacroExpands(Info.Tok, Info.MD, Info.Range); } DelayedMacroExpandsCallbacks.clear(); } diff --git a/lib/Lex/PreprocessingRecord.cpp b/lib/Lex/PreprocessingRecord.cpp index 0f3587e31c..b834d6cfb8 100644 --- a/lib/Lex/PreprocessingRecord.cpp +++ b/lib/Lex/PreprocessingRecord.cpp @@ -382,33 +382,34 @@ void PreprocessingRecord::addMacroExpansion(const Token &Id, } void PreprocessingRecord::Ifdef(SourceLocation Loc, const Token &MacroNameTok, - const MacroInfo *MI) { + const MacroDirective *MD) { // This is not actually a macro expansion but record it as a macro reference. - if (MI) - addMacroExpansion(MacroNameTok, MI, MacroNameTok.getLocation()); + if (MD) + addMacroExpansion(MacroNameTok, MD->getInfo(), MacroNameTok.getLocation()); } void PreprocessingRecord::Ifndef(SourceLocation Loc, const Token &MacroNameTok, - const MacroInfo *MI) { + const MacroDirective *MD) { // This is not actually a macro expansion but record it as a macro reference. - if (MI) - addMacroExpansion(MacroNameTok, MI, MacroNameTok.getLocation()); + if (MD) + addMacroExpansion(MacroNameTok, MD->getInfo(), MacroNameTok.getLocation()); } void PreprocessingRecord::Defined(const Token &MacroNameTok, - const MacroInfo *MI) { + const MacroDirective *MD) { // This is not actually a macro expansion but record it as a macro reference. - if (MI) - addMacroExpansion(MacroNameTok, MI, MacroNameTok.getLocation()); + if (MD) + addMacroExpansion(MacroNameTok, MD->getInfo(), MacroNameTok.getLocation()); } -void PreprocessingRecord::MacroExpands(const Token &Id, const MacroInfo* MI, +void PreprocessingRecord::MacroExpands(const Token &Id,const MacroDirective *MD, SourceRange Range) { - addMacroExpansion(Id, MI, Range); + addMacroExpansion(Id, MD->getInfo(), Range); } void PreprocessingRecord::MacroDefined(const Token &Id, - const MacroInfo *MI) { + const MacroDirective *MD) { + const MacroInfo *MI = MD->getInfo(); SourceRange R(MI->getDefinitionLoc(), MI->getDefinitionEndLoc()); MacroDefinition *Def = new (*this) MacroDefinition(Id.getIdentifierInfo(), R); @@ -417,10 +418,10 @@ void PreprocessingRecord::MacroDefined(const Token &Id, } void PreprocessingRecord::MacroUndefined(const Token &Id, - const MacroInfo *MI) { + const MacroDirective *MD) { // Note: MI may be null (when #undef'ining an undefined macro). - if (MI) - MacroDefinitions.erase(MI); + if (MD) + MacroDefinitions.erase(MD->getInfo()); } void PreprocessingRecord::InclusionDirective( diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index 8209c3c136..af000ec1d1 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -642,10 +642,11 @@ void Preprocessor::HandleIdentifier(Token &Identifier) { } // If this is a macro to be expanded, do it. - if (MacroInfo *MI = getMacroInfo(&II)) { + if (MacroDirective *MD = getMacroDirective(&II)) { + MacroInfo *MI = MD->getInfo(); if (!DisableMacroExpansion) { if (!Identifier.isExpandDisabled() && MI->isEnabled()) { - if (!HandleMacroExpandedIdentifier(Identifier, MI)) + if (!HandleMacroExpandedIdentifier(Identifier, MD)) return; } else { // C99 6.10.3.4p2 says that a disabled macro may never again be |