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:
parent
619c174561
commit
5d1c02748f
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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).
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue