]> granicus.if.org Git - clang/commitdiff
Change hte lexer to start a start pointer to the underlying
authorChris Lattner <sabre@nondot.org>
Sun, 22 Jul 2007 18:44:36 +0000 (18:44 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 22 Jul 2007 18:44:36 +0000 (18:44 +0000)
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

Lex/Lexer.cpp
include/clang/Lex/Lexer.h

index 84cec226918451194feca0364ea48962c811f114..f23d34ed422f7aa48889cf841b4446f26d5c2f1c 100644 (file)
@@ -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);
   
index 3103972e5246685872b08d4c54317af5731f6c6c..6cff00020784a8017bd4397827377d041d846832 100644 (file)
 #include <vector>
 #include <cassert>
 
-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).