]> granicus.if.org Git - clang/commitdiff
This is a follow-up to r62675:
authorChris Lattner <sabre@nondot.org>
Fri, 23 Jan 2009 18:35:48 +0000 (18:35 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 23 Jan 2009 18:35:48 +0000 (18:35 +0000)
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

include/clang/Basic/IdentifierTable.h
lib/Lex/Lexer.cpp
lib/Lex/PTHLexer.cpp
lib/Lex/Preprocessor.cpp
lib/Lex/TokenLexer.cpp

index a06e9b10807b331cb5002eb2bcc27992ba0e830a..56a6f4184852eac51ecd0e570f6480ca63960724 100644 (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());
   }
 };
 
index fca8fd4eb165459e1faface0be232f7d34544bf4..3174a0591745f2e8ad586df0e9cf4b6f6ab5a52b 100644 (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())
index b0f06271c4fbd3c4cc2f7a73408bb384c02e051c..ec76a299845b1824d883f234e2c2f22911ffa683 100644 (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;
index e53c392c388b34a42ceb261c95f12e16a91925f8..d0a15e45c4146c476009b860af896051307a2eaa 100644 (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)
index c945843459f400e69b9c660f656ec40cdc171196..dd5352c1b6164bb2816a65541f537295c83ad7b1 100644 (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.
 }