[cfe-commits] r62445 - /cfe/trunk/lib/Lex/PTHLexer.cpp

Chris Lattner sabre at nondot.org
Sat Jan 17 18:10:31 PST 2009


Author: lattner
Date: Sat Jan 17 20:10:31 2009
New Revision: 62445

URL: http://llvm.org/viewvc/llvm-project?rev=62445&view=rev
Log:
switch PTHLexer to use Read32 and friends instead of lots of inlined
copies.  I verified that this causes no performance change in PTH.

Modified:
    cfe/trunk/lib/Lex/PTHLexer.cpp

Modified: cfe/trunk/lib/Lex/PTHLexer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PTHLexer.cpp?rev=62445&r1=62444&r2=62445&view=diff

==============================================================================
--- cfe/trunk/lib/Lex/PTHLexer.cpp (original)
+++ cfe/trunk/lib/Lex/PTHLexer.cpp Sat Jan 17 20:10:31 2009
@@ -86,23 +86,13 @@
   // Shadow CurPtr into an automatic variable.
   const unsigned char *CurPtrShadow = CurPtr;  
 
-  // Read in the data for the token.  14 bytes in total.
-  tok::TokenKind k = (tok::TokenKind) CurPtrShadow[0];
-  Token::TokenFlags flags = (Token::TokenFlags) CurPtrShadow[1];
-    
-  uint32_t perID = ((uint32_t) CurPtrShadow[2])
-      | (((uint32_t) CurPtrShadow[3]) << 8)
-      | (((uint32_t) CurPtrShadow[4]) << 16);
-  
-  uint32_t FileOffset = ((uint32_t) CurPtrShadow[5])
-      | (((uint32_t) CurPtrShadow[6]) << 8)
-      | (((uint32_t) CurPtrShadow[7]) << 16)
-      | (((uint32_t) CurPtrShadow[8]) << 24);
-  
-  uint32_t Len = ((uint32_t) CurPtrShadow[9])
-      | (((uint32_t) CurPtrShadow[10]) << 8);
-  
-  CurPtr = CurPtrShadow + DISK_TOKEN_SIZE;
+  // Read in the data for the token.
+  tok::TokenKind k = (tok::TokenKind) Read8(CurPtrShadow);
+  Token::TokenFlags flags = (Token::TokenFlags) Read8(CurPtrShadow);
+  uint32_t perID = Read24(CurPtrShadow);
+  uint32_t FileOffset = Read32(CurPtrShadow);
+  uint32_t Len = Read16(CurPtrShadow);
+  CurPtr = CurPtrShadow;
   
   //===--------------------------------------==//
   // Construct the token itself.
@@ -302,18 +292,14 @@
 }
 
 SourceLocation PTHLexer::getSourceLocation() {
-  // getLocation is not on the hot path.  It is used to get the location of
-  // the next token when transitioning back to this lexer when done
+  // getSourceLocation is not on the hot path.  It is used to get the location
+  // of the next token when transitioning back to this lexer when done
   // handling a #included file.  Just read the necessary data from the token
   // data buffer to construct the SourceLocation object.
   // NOTE: This is a virtual function; hence it is defined out-of-line.
-  const unsigned char* p = CurPtr + (1 + 1 + 3);
-  uint32_t offset = 
-       ((uint32_t) ((uint8_t) p[0]))
-    | (((uint32_t) ((uint8_t) p[1])) << 8)
-    | (((uint32_t) ((uint8_t) p[2])) << 16)
-    | (((uint32_t) ((uint8_t) p[3])) << 24);
-  return FileStartLoc.getFileLocWithOffset(offset);
+  const unsigned char *OffsetPtr = CurPtr + (1 + 1 + 3);
+  uint32_t Offset = Read32(OffsetPtr);
+  return FileStartLoc.getFileLocWithOffset(Offset);
 }
 
 //===----------------------------------------------------------------------===//
@@ -325,7 +311,7 @@
   llvm::DenseMap<FileID, PTHSpellingSearch*>::iterator I =SpellingMap.find(FID);
 
   if (I == SpellingMap.end())
-      return 0;
+    return 0;
 
   return I->second->getSpellingBinarySearch(FPos, Buffer);
 }
@@ -339,91 +325,69 @@
 
 unsigned PTHManager::getSpellingAtPTHOffset(unsigned PTHOffset,
                                             const char *&Buffer) {
-
-  const char* p = Buf->getBufferStart() + PTHOffset;
-  assert(p < Buf->getBufferEnd());
+  assert(PTHOffset < Buf->getBufferSize());
+  const unsigned char* Ptr =
+    (const unsigned char*)Buf->getBufferStart() + PTHOffset;
   
   // The string is prefixed by 16 bits for its length, followed by the string
   // itself.
-  unsigned len = ((unsigned) ((uint8_t) p[0]))
-    | (((unsigned) ((uint8_t) p[1])) << 8);
-
-  Buffer = p + 2;
-  return len;
+  unsigned Len = Read16(Ptr);
+  Buffer = (const char *)Ptr;
+  return Len;
 }
 
-unsigned PTHSpellingSearch::getSpellingLinearSearch(unsigned fpos,
+unsigned PTHSpellingSearch::getSpellingLinearSearch(unsigned FPos,
                                                     const char *&Buffer) {
-  const unsigned char* p = LinearItr;
-  unsigned len = 0;
+  const unsigned char *Ptr = LinearItr;
+  unsigned Len = 0;
   
-  if (p == TableEnd)
-    return getSpellingBinarySearch(fpos, Buffer);
+  if (Ptr == TableEnd)
+    return getSpellingBinarySearch(FPos, Buffer);
   
   do {
-    uint32_t TokOffset = 
-      ((uint32_t) ((uint8_t) p[0]))
-      | (((uint32_t) ((uint8_t) p[1])) << 8)
-      | (((uint32_t) ((uint8_t) p[2])) << 16)
-      | (((uint32_t) ((uint8_t) p[3])) << 24);
+    uint32_t TokOffset = Read32(Ptr);
     
-    if (TokOffset > fpos)
-      return getSpellingBinarySearch(fpos, Buffer);
+    if (TokOffset > FPos)
+      return getSpellingBinarySearch(FPos, Buffer);
     
     // Did we find a matching token offset for this spelling?
-    if (TokOffset == fpos) {
-      uint32_t SpellingPTHOffset = 
-        ((uint32_t) ((uint8_t) p[4]))
-        | (((uint32_t) ((uint8_t) p[5])) << 8)
-        | (((uint32_t) ((uint8_t) p[6])) << 16)
-        | (((uint32_t) ((uint8_t) p[7])) << 24);
-      
-      p += SpellingEntrySize;
-      len = PTHMgr.getSpellingAtPTHOffset(SpellingPTHOffset, Buffer);
+    if (TokOffset == FPos) {
+      uint32_t SpellingPTHOffset = Read32(Ptr);
+      Len = PTHMgr.getSpellingAtPTHOffset(SpellingPTHOffset, Buffer);
       break;
     }
+  } while (Ptr != TableEnd);
 
-    // No match.  Keep on looking.
-    p += SpellingEntrySize;
-  }
-  while (p != TableEnd);
-
-  LinearItr = p;
-  return len;
+  LinearItr = Ptr;
+  return Len;
 }
 
 
-unsigned PTHSpellingSearch::getSpellingBinarySearch(unsigned fpos,
+unsigned PTHSpellingSearch::getSpellingBinarySearch(unsigned FPos,
                                                     const char *&Buffer) {
   
   assert((TableEnd - TableBeg) % SpellingEntrySize == 0);
+  assert(TableEnd >= TableBeg);
   
   if (TableEnd == TableBeg)
     return 0;
   
-  assert(TableEnd > TableBeg);
-  
   unsigned min = 0;
-  const unsigned char* tb = TableBeg;
+  const unsigned char *tb = TableBeg;
   unsigned max = NumSpellings;
 
   do {
     unsigned i = (max - min) / 2 + min;
-    const unsigned char* p = tb + (i * SpellingEntrySize);
+    const unsigned char *Ptr = tb + (i * SpellingEntrySize);
     
-    uint32_t TokOffset = 
-      ((uint32_t) ((uint8_t) p[0]))
-      | (((uint32_t) ((uint8_t) p[1])) << 8)
-      | (((uint32_t) ((uint8_t) p[2])) << 16)
-      | (((uint32_t) ((uint8_t) p[3])) << 24);
-    
-    if (TokOffset > fpos) {
+    uint32_t TokOffset = Read32(Ptr);
+    if (TokOffset > FPos) {
       max = i;
       assert(!(max == min) || (min == i));
       continue;
     }
     
-    if (TokOffset < fpos) {
+    if (TokOffset < FPos) {
       if (i == min)
         break;
       
@@ -431,12 +395,7 @@
       continue;
     }
     
-    uint32_t SpellingPTHOffset = 
-        ((uint32_t) ((uint8_t) p[4]))
-        | (((uint32_t) ((uint8_t) p[5])) << 8)
-        | (((uint32_t) ((uint8_t) p[6])) << 16)
-        | (((uint32_t) ((uint8_t) p[7])) << 24);
-    
+    uint32_t SpellingPTHOffset = Read32(Ptr);
     return PTHMgr.getSpellingAtPTHOffset(SpellingPTHOffset, Buffer);
   }
   while (min != max);
@@ -472,28 +431,27 @@
     uint32_t TokenOff;
     uint32_t PPCondOff;
     uint32_t SpellingOff;
-    
   public:
     Val() : TokenOff(~0) {}
     Val(uint32_t toff, uint32_t poff, uint32_t soff)
       : TokenOff(toff), PPCondOff(poff), SpellingOff(soff) {}
     
+    bool isValid() const { return TokenOff != ~((uint32_t)0); }
+
     uint32_t getTokenOffset() const {
-      assert(TokenOff != ~((uint32_t)0) && "PTHFileLookup entry initialized.");
+      assert(isValid() && "PTHFileLookup entry initialized.");
       return TokenOff;
     }
     
     uint32_t getPPCondOffset() const {
-      assert(TokenOff != ~((uint32_t)0) && "PTHFileLookup entry initialized.");
+      assert(isValid() && "PTHFileLookup entry initialized.");
       return PPCondOff;
     }
     
     uint32_t getSpellingOffset() const {
-      assert(TokenOff != ~((uint32_t)0) && "PTHFileLookup entry initialized.");
+      assert(isValid() && "PTHFileLookup entry initialized.");
       return SpellingOff;
     }
-    
-    bool isValid() const { return TokenOff != ~((uint32_t)0); }
   };
   
 private:
@@ -512,15 +470,15 @@
     uint32_t N = Read32(D);     // Read the length of the table.
     
     for ( ; N > 0; --N) {       // The rest of the data is the table itself.
-      uint32_t len = Read32(D);
+      uint32_t Len = Read32(D);
       const char* s = (const char *)D;
-      D += len;
+      D += Len;
 
       uint32_t TokenOff = Read32(D);
       uint32_t PPCondOff = Read32(D);
       uint32_t SpellingOff = Read32(D);
 
-      FileMap.GetOrCreateValue(s, s+len).getValue() =
+      FileMap.GetOrCreateValue(s, s+Len).getValue() =
         Val(TokenOff, PPCondOff, SpellingOff);      
     }
   }
@@ -546,7 +504,6 @@
 }
 
 PTHManager* PTHManager::Create(const std::string& file) {
-  
   // Memory map the PTH file.
   llvm::OwningPtr<llvm::MemoryBuffer>
   File(llvm::MemoryBuffer::getFile(file.c_str()));
@@ -646,30 +603,26 @@
 IdentifierInfo* PTHManager::get(const char *NameStart, const char *NameEnd) {
   unsigned min = 0;
   unsigned max = NumIds;
-  unsigned len = NameEnd - NameStart;
+  unsigned Len = NameEnd - NameStart;
   
   do {
     unsigned i = (max - min) / 2 + min;
-    const unsigned char* p = SortedIdTable + (i * 4);
+    const unsigned char *Ptr = SortedIdTable + (i * 4);
     
     // Read the persistentID.
-    unsigned perID = 
-      ((unsigned) ((uint8_t) p[0]))
-      | (((unsigned) ((uint8_t) p[1])) << 8)
-      | (((unsigned) ((uint8_t) p[2])) << 16)
-      | (((unsigned) ((uint8_t) p[3])) << 24);
+    unsigned perID = Read32(Ptr);
     
     // Get the IdentifierInfo.
     IdentifierInfo* II = GetIdentifierInfo(perID);
     
     // First compare the lengths.
     unsigned IILen = II->getLength();
-    if (len < IILen) goto IsLess;
-    if (len > IILen) goto IsGreater;
+    if (Len < IILen) goto IsLess;
+    if (Len > IILen) goto IsGreater;
     
     // Now compare the strings!
     {
-      signed comp = strncmp(NameStart, II->getName(), len);
+      signed comp = strncmp(NameStart, II->getName(), Len);
       if (comp < 0) goto IsLess;
       if (comp > 0) goto IsGreater;
     }    
@@ -710,19 +663,19 @@
 
   // Get the location of pp-conditional table.
   const unsigned char* ppcond = BufStart + FileData.getPPCondOffset();
-  uint32_t len = Read32(ppcond);
-  if (len == 0) ppcond = 0;
+  uint32_t Len = Read32(ppcond);
+  if (Len == 0) ppcond = 0;
   
   // Get the location of the spelling table.
   const unsigned char* spellingTable = BufStart + FileData.getSpellingOffset();
   
-  len = Read32(spellingTable);
-  if (len == 0) spellingTable = 0;
+  Len = Read32(spellingTable);
+  if (Len == 0) spellingTable = 0;
 
   assert(data < (const unsigned char*)Buf->getBufferEnd());
   
   // Create the SpellingSearch object for this FileID.
-  PTHSpellingSearch* ss = new PTHSpellingSearch(*this, len, spellingTable);
+  PTHSpellingSearch* ss = new PTHSpellingSearch(*this, Len, spellingTable);
   SpellingMap[FID] = ss;
   
   assert(PP && "No preprocessor set yet!");





More information about the cfe-commits mailing list