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%.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62855
91177308-0d34-0410-b5e6-
96231b3b80d8
/// 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.
void RecomputeNeedsHandleIdentifier() {
NeedsHandleIdentifier =
(isPoisoned() | hasMacroDefinition() | isCPlusPlusOperatorKeyword() |
- isExtensionToken()) || getTokenID() != tok::identifier;
+ isExtensionToken());
}
};
// 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())
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;
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)
}
// 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.
}