- In PTHLexer::Lex read all of the token data from PTH file before
  constructing the token.  The idea is to enhance locality.
- Do not use Read8/Read32 in PTHLexer::Lex.  Inline these operations manually.
- Change PTHManager::ReadIdentifierInfo() to PTHManager::GetIdentifierInfo().
  They are functionally the same except that PTHLexer::Lex() reads the
  persistent id.

These changes result in a 3.3% speedup for PTH on Cocoa.h (-Eonly).



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61363 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Ted Kremenek 2008-12-23 02:30:15 +00:00
Родитель e5680f3cd6
Коммит 866bdf7454
2 изменённых файлов: 48 добавлений и 39 удалений

Просмотреть файл

@ -66,9 +66,9 @@ class PTHManager {
PTHManager();
void operator=(const PTHManager&);
/// ReadIdentifierInfo - Used by PTHManager to reconstruct IdentifierInfo
/// GetIdentifierInfo - Used by PTHManager to reconstruct IdentifierInfo
/// objects from the PTH file.
IdentifierInfo* ReadIdentifierInfo(const char*& D);
IdentifierInfo* GetIdentifierInfo(unsigned);
public:

Просмотреть файл

@ -55,32 +55,51 @@ PTHLexer::PTHLexer(Preprocessor& pp, SourceLocation fileloc, const char* D,
void PTHLexer::Lex(Token& Tok) {
LexNextToken:
// Read the token.
// FIXME: Setting the flags directly should obviate this step.
Tok.startToken();
// Shadow CurPtr into an automatic variable so that Read8 doesn't load and
// store back into the instance variable.
const char *CurPtrShadow = CurPtr;
// Read the type of the token.
Tok.setKind((tok::TokenKind) Read8(CurPtrShadow));
// Set flags. This is gross, since we are really setting multiple flags.
Tok.setFlag((Token::TokenFlags) Read8(CurPtrShadow));
// Set the IdentifierInfo* (if any).
Tok.setIdentifierInfo(PTHMgr.ReadIdentifierInfo(CurPtrShadow));
// Set the SourceLocation. Since all tokens are constructed using a
// raw lexer, they will all be offseted from the same FileID.
Tok.setLocation(SourceLocation::getFileLoc(FileID, Read32(CurPtrShadow)));
// Finally, read and set the length of the token.
Tok.setLength(Read32(CurPtrShadow));
CurPtr = CurPtrShadow;
//===--------------------------------------==//
// Read the raw token data.
//===--------------------------------------==//
// Shadow CurPtr into an automatic variable.
const unsigned char *CurPtrShadow = (const unsigned char*) 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 persistentID = ((uint32_t) CurPtrShadow[2])
| (((uint32_t) CurPtrShadow[3]) << 8)
| (((uint32_t) CurPtrShadow[4]) << 16)
| (((uint32_t) CurPtrShadow[5]) << 24);
uint32_t FileOffset = ((uint32_t) CurPtrShadow[6])
| (((uint32_t) CurPtrShadow[7]) << 8)
| (((uint32_t) CurPtrShadow[8]) << 16)
| (((uint32_t) CurPtrShadow[9]) << 24);
uint32_t Len = ((uint32_t) CurPtrShadow[10])
| (((uint32_t) CurPtrShadow[11]) << 8)
| (((uint32_t) CurPtrShadow[12]) << 16)
| (((uint32_t) CurPtrShadow[13]) << 24);
CurPtr = (const char*) (CurPtrShadow + DISK_TOKEN_SIZE);
//===--------------------------------------==//
// Construct the token itself.
//===--------------------------------------==//
Tok.startToken();
Tok.setKind(k);
Tok.setFlag(flags);
Tok.setIdentifierInfo(persistentID ? PTHMgr.GetIdentifierInfo(persistentID-1)
: 0);
Tok.setLocation(SourceLocation::getFileLoc(FileID, FileOffset));
Tok.setLength(Len);
//===--------------------------------------==//
// Process the token.
//===--------------------------------------==//
if (Tok.is(tok::eof)) {
// Save the end-of-file token.
@ -437,18 +456,8 @@ PTHManager* PTHManager::Create(const std::string& file, Preprocessor& PP) {
return new PTHManager(File.take(), FL.take(), IData, PerIDCache, PP);
}
IdentifierInfo* PTHManager::ReadIdentifierInfo(const char*& D) {
// Read the persistent ID from the PTH file.
uint32_t persistentID = Read32(D);
// A persistent ID of '0' always maps to NULL.
if (!persistentID)
return 0;
// Adjust the persistent ID by subtracting '1' so that it can be used
// as an index within a table in the PTH file.
--persistentID;
IdentifierInfo* PTHManager::GetIdentifierInfo(unsigned persistentID) {
// Check if the IdentifierInfo has already been resolved.
IdentifierInfo*& II = PerIDCache[persistentID];
if (II) return II;