This is a follow-up to r62675:

Refactor how the preprocessor changes a token from being an tok::identifier to a 
keyword (e.g. tok::kw_for).  Instead of doing this in HandleIdentifier, hoist this
common case out into the caller, so that every keyword doesn't have to go through
HandleIdentifier.  This drops time in HandleIdentifier from 1.25ms to .62ms, and
speeds up clang -Eonly with PTH by about 1%.

llvm-svn: 62855
This commit is contained in:
Chris Lattner 2009-01-23 18:35:48 +00:00
parent 9db60a38e9
commit 1f6c7fe6a8
5 changed files with 20 additions and 16 deletions

View File

@ -122,14 +122,7 @@ public:
/// can be used to cause the lexer to map identifiers to source-language
/// tokens.
tok::TokenKind getTokenID() const { return (tok::TokenKind)TokenID; }
void setTokenID(tok::TokenKind ID) {
TokenID = ID;
if (ID != tok::identifier)
NeedsHandleIdentifier = 1;
else
RecomputeNeedsHandleIdentifier();
}
void setTokenID(tok::TokenKind ID) { TokenID = ID; }
/// getPPKeywordID - Return the preprocessor keyword ID for this identifier.
/// For example, "define" will return tok::pp_define.
@ -225,7 +218,7 @@ private:
void RecomputeNeedsHandleIdentifier() {
NeedsHandleIdentifier =
(isPoisoned() | hasMacroDefinition() | isCPlusPlusOperatorKeyword() |
isExtensionToken()) || getTokenID() != tok::identifier;
isExtensionToken());
}
};

View File

@ -558,6 +558,10 @@ FinishIdentifier:
// identifier table.
IdentifierInfo *II = PP->LookUpIdentifierInfo(Result, IdStart);
// Change the kind of this identifier to the appropriate token kind, e.g.
// turning "for" into a keyword.
Result.setKind(II->getTokenID());
// Finally, now that we know we have an identifier, pass this off to the
// preprocessor, which may macro expand it or something.
if (II->isHandleIdentifierCase())

View File

@ -101,7 +101,13 @@ LexNextToken:
if (IdentifierID) {
MIOpt.ReadToken();
IdentifierInfo *II = PTHMgr.GetIdentifierInfo(IdentifierID-1);
Tok.setIdentifierInfo(II);
// Change the kind of this identifier to the appropriate token kind, e.g.
// turning "for" into a keyword.
Tok.setKind(II->getTokenID());
if (II->isHandleIdentifierCase())
PP->HandleIdentifier(Tok);
return;

View File

@ -759,10 +759,6 @@ void Preprocessor::HandleIdentifier(Token &Identifier) {
if (II.isCPlusPlusOperatorKeyword())
Identifier.setIdentifierInfo(0);
// Change the kind of this identifier to the appropriate token kind, e.g.
// turning "for" into a keyword.
Identifier.setKind(II.getTokenID());
// If this is an extension token, diagnose its use.
// We avoid diagnosing tokens that originate from macro definitions.
if (II.isExtensionToken() && Features.C99 && !DisableMacroExpansion)

View File

@ -326,9 +326,14 @@ void TokenLexer::Lex(Token &Tok) {
}
// Handle recursive expansion!
if (Tok.getIdentifierInfo() && !DisableMacroExpansion &&
Tok.getIdentifierInfo()->isHandleIdentifierCase())
PP.HandleIdentifier(Tok);
if (IdentifierInfo *II = Tok.getIdentifierInfo()) {
// Change the kind of this identifier to the appropriate token kind, e.g.
// turning "for" into a keyword.
Tok.setKind(II->getTokenID());
if (!DisableMacroExpansion && II->isHandleIdentifierCase())
PP.HandleIdentifier(Tok);
}
// Otherwise, return a normal token.
}