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%

llvm-svn: 40394
This commit is contained in:
Chris Lattner 2007-07-22 18:44:36 +00:00
parent 619c174561
commit 5d1c02748f
2 changed files with 12 additions and 10 deletions

View File

@ -40,13 +40,19 @@ Lexer::Lexer(SourceLocation fileloc, Preprocessor &pp,
: FileLoc(fileloc), PP(pp), Features(PP.getLangOptions()) { : FileLoc(fileloc), PP(pp), Features(PP.getLangOptions()) {
SourceManager &SourceMgr = PP.getSourceManager(); 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; Is_PragmaLexer = false;
IsMainFile = false; IsMainFile = false;
InitCharacterInfo(); 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(); BufferEnd = BufEnd ? BufEnd : InputFile->getBufferEnd();
assert(BufferEnd[0] == 0 && assert(BufferEnd[0] == 0 &&
@ -177,12 +183,12 @@ static SourceLocation GetMappedTokenLoc(Preprocessor &PP,
/// getSourceLocation - Return a source location identifier for the specified /// getSourceLocation - Return a source location identifier for the specified
/// offset in the current file. /// offset in the current file.
SourceLocation Lexer::getSourceLocation(const char *Loc) const { 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!"); "Location out of range for this buffer!");
// In the normal case, we're just lexing from a simple file buffer, return // In the normal case, we're just lexing from a simple file buffer, return
// the file id from FileLoc with the offset specified. // the file id from FileLoc with the offset specified.
unsigned CharNo = Loc-InputFile->getBufferStart(); unsigned CharNo = Loc-BufferStart;
if (FileLoc.isFileID()) if (FileLoc.isFileID())
return SourceLocation::getFileLoc(FileLoc.getFileID(), CharNo); return SourceLocation::getFileLoc(FileLoc.getFileID(), CharNo);

View File

@ -21,10 +21,6 @@
#include <vector> #include <vector>
#include <cassert> #include <cassert>
namespace llvm {
class MemoryBuffer;
}
namespace clang { namespace clang {
class Diagnostic; class Diagnostic;
class Preprocessor; class Preprocessor;
@ -36,8 +32,8 @@ class Preprocessor;
class Lexer { class Lexer {
//===--------------------------------------------------------------------===// //===--------------------------------------------------------------------===//
// Constant configuration values for this lexer. // Constant configuration values for this lexer.
const char *BufferStart; // Start of the buffer.
const char *BufferEnd; // End 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. SourceLocation FileLoc; // Location for start of file.
Preprocessor &PP; // Preprocessor object controlling lexing. Preprocessor &PP; // Preprocessor object controlling lexing.
LangOptions Features; // Features enabled by this language (cache). LangOptions Features; // Features enabled by this language (cache).