From: Chris Lattner Date: Sun, 22 Jul 2007 18:44:36 +0000 (+0000) Subject: Change hte lexer to start a start pointer to the underlying X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=448cec4c1c3705f6f49ffdefb58a7329942a2dd8;p=clang Change hte lexer to start a start pointer to the underlying memorybuffer instead of a pointer to the memorybuffer itself. This reduces coupling and eliminates a pointer dereference on a hot path. This speeds up -Eonly on 483.xalancbmk by 2.1% git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40394 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Lex/Lexer.cpp b/Lex/Lexer.cpp index 84cec22691..f23d34ed42 100644 --- a/Lex/Lexer.cpp +++ b/Lex/Lexer.cpp @@ -40,13 +40,19 @@ Lexer::Lexer(SourceLocation fileloc, Preprocessor &pp, : FileLoc(fileloc), PP(pp), Features(PP.getLangOptions()) { SourceManager &SourceMgr = PP.getSourceManager(); - InputFile =SourceMgr.getBuffer(SourceMgr.getPhysicalLoc(FileLoc).getFileID()); + unsigned InputFileID = SourceMgr.getPhysicalLoc(FileLoc).getFileID(); + const llvm::MemoryBuffer *InputFile = SourceMgr.getBuffer(InputFileID); Is_PragmaLexer = false; IsMainFile = false; InitCharacterInfo(); - - BufferPtr = BufStart ? BufStart : InputFile->getBufferStart(); + + // BufferStart must always be InputFile->getBufferStart(). + BufferStart = InputFile->getBufferStart(); + + // BufferPtr and BufferEnd can start out somewhere inside the current buffer. + // If unspecified, they starts at the start/end of the buffer. + BufferPtr = BufStart ? BufStart : BufferStart; BufferEnd = BufEnd ? BufEnd : InputFile->getBufferEnd(); assert(BufferEnd[0] == 0 && @@ -177,12 +183,12 @@ static SourceLocation GetMappedTokenLoc(Preprocessor &PP, /// getSourceLocation - Return a source location identifier for the specified /// offset in the current file. SourceLocation Lexer::getSourceLocation(const char *Loc) const { - assert(Loc >= InputFile->getBufferStart() && Loc <= BufferEnd && + assert(Loc >= BufferStart && Loc <= BufferEnd && "Location out of range for this buffer!"); // In the normal case, we're just lexing from a simple file buffer, return // the file id from FileLoc with the offset specified. - unsigned CharNo = Loc-InputFile->getBufferStart(); + unsigned CharNo = Loc-BufferStart; if (FileLoc.isFileID()) return SourceLocation::getFileLoc(FileLoc.getFileID(), CharNo); diff --git a/include/clang/Lex/Lexer.h b/include/clang/Lex/Lexer.h index 3103972e52..6cff000207 100644 --- a/include/clang/Lex/Lexer.h +++ b/include/clang/Lex/Lexer.h @@ -21,10 +21,6 @@ #include #include -namespace llvm { - class MemoryBuffer; -} - namespace clang { class Diagnostic; class Preprocessor; @@ -36,8 +32,8 @@ class Preprocessor; class Lexer { //===--------------------------------------------------------------------===// // Constant configuration values for this lexer. + const char *BufferStart; // Start of the buffer. const char *BufferEnd; // End of the buffer. - const llvm::MemoryBuffer *InputFile; // The file we are reading from. SourceLocation FileLoc; // Location for start of file. Preprocessor &PP; // Preprocessor object controlling lexing. LangOptions Features; // Features enabled by this language (cache).