]> granicus.if.org Git - clang/commitdiff
Make SourceLocation::getFileLoc private to reduce the API exposure of
authorChris Lattner <sabre@nondot.org>
Mon, 19 Jan 2009 06:46:35 +0000 (06:46 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 19 Jan 2009 06:46:35 +0000 (06:46 +0000)
SourceLocation.  This requires making some cleanups to token pasting
and _Pragma expansion.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62490 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/SourceLocation.h
include/clang/Basic/SourceManager.h
include/clang/Lex/Lexer.h
lib/Lex/Lexer.cpp
lib/Lex/Pragma.cpp
lib/Lex/TokenLexer.cpp

index 4c0f0e9d462ef86c98f6b4818b179b8ce53ad148..858b7636663629d0b30eb90f8b27d2a52f6257cc 100644 (file)
@@ -64,6 +64,7 @@ private:
 /// an input translation unit.
 class SourceLocation {
   unsigned ID;
+  friend class SourceManager;
 public:
   enum {
     // FileID Layout:
@@ -100,6 +101,7 @@ public:
   bool isValid() const { return ID != 0; }
   bool isInvalid() const { return ID == 0; }
   
+private:
   static SourceLocation getFileLoc(unsigned ChunkID, unsigned FilePos) {
     SourceLocation L;
     // If a FilePos is larger than (1<<FilePosBits), the SourceManager makes
@@ -116,6 +118,7 @@ public:
     L.ID = (ChunkID << FilePosBits) | FilePos;
     return L;
   }
+public:
   
   static bool isValidMacroSpellingOffs(int Val) {
     if (Val >= 0)
index 08929e39c1e5ea09d37e401d50eaa58ce914cf2b..629d8ca574c4d3cc9618b6462b98aaade99e412f 100644 (file)
@@ -324,7 +324,6 @@ public:
     return SourceLocation::getFileLoc(FID.ID, 0);
   }
   
-  
   /// getInstantiationLoc - Return a new SourceLocation that encodes the fact
   /// that a token at Loc should actually be referenced from InstantiationLoc.
   SourceLocation getInstantiationLoc(SourceLocation Loc,
index afaf4ba07b56269f0dcc2afc517c6e6d6b1460c1..42cdd9170a8bed2d7fe5a0d2284e5949830bcf64 100644 (file)
@@ -93,8 +93,9 @@ public:
   /// Create_PragmaLexer: Lexer constructor - Create a new lexer object for
   /// _Pragma expansion.  This has a variety of magic semantics that this method
   /// sets up.  It returns a new'd Lexer that must be delete'd when done.
-  static Lexer *Create_PragmaLexer(SourceLocation TokStartLoc, unsigned TokLen,
-                                   Preprocessor &PP);
+  static Lexer *Create_PragmaLexer(SourceLocation SpellingLoc, 
+                                   SourceLocation InstantiationLoc,
+                                   unsigned TokLen, Preprocessor &PP);
   
   
   /// getFeatures - Return the language features currently enabled.  NOTE: this
index 6e5402e8a375e53be506399c21861c1fa33532d3..9280526d22dcd54d136f949a5ea684c46abc2b8f 100644 (file)
@@ -150,13 +150,14 @@ Lexer::Lexer(FileID FID, const SourceManager &SM, const LangOptions &features)
 /// interface that could handle this stuff.  This would pull GetMappedTokenLoc
 /// out of the critical path of the lexer!
 ///
-Lexer *Lexer::Create_PragmaLexer(SourceLocation TokStartLoc, unsigned TokLen,
-                                 Preprocessor &PP) {
+Lexer *Lexer::Create_PragmaLexer(SourceLocation SpellingLoc, 
+                                 SourceLocation InstantiationLoc,
+                                 unsigned TokLen, Preprocessor &PP) {
   SourceManager &SM = PP.getSourceManager();
-  SourceLocation SpellingLoc = SM.getSpellingLoc(TokStartLoc);
 
   // Create the lexer as if we were going to lex the file normally.
-  Lexer *L = new Lexer(SM.getCanonicalFileID(SpellingLoc), PP);
+  FileID SpellingFID = SM.getCanonicalFileID(SpellingLoc);
+  Lexer *L = new Lexer(SpellingFID, PP);
   
   // Now that the lexer is created, change the start/end locations so that we
   // just lex the subsection of the file that we want.  This is lexing from a
@@ -168,7 +169,8 @@ Lexer *Lexer::Create_PragmaLexer(SourceLocation TokStartLoc, unsigned TokLen,
 
   // Set the SourceLocation with the remapping information.  This ensures that
   // GetMappedTokenLoc will remap the tokens as they are lexed.
-  L->FileLoc = TokStartLoc;
+  L->FileLoc = SM.getInstantiationLoc(SM.getLocForStartOfFile(SpellingFID),
+                                      InstantiationLoc);
   
   // Ensure that the lexer thinks it is inside a directive, so that end \n will
   // return an EOM token.
@@ -321,7 +323,7 @@ static SourceLocation GetMappedTokenLoc(Preprocessor &PP,
   // characters come from spelling(FileLoc)+Offset.
   SourceLocation InstLoc = SourceMgr.getInstantiationLoc(FileLoc);
   SourceLocation SpellingLoc = SourceMgr.getSpellingLoc(FileLoc);
-  SpellingLoc = SourceLocation::getFileLoc(SpellingLoc.getChunkID(), CharNo);
+  SpellingLoc = SpellingLoc.getFileLocWithOffset(CharNo);
   return SourceMgr.getInstantiationLoc(SpellingLoc, InstLoc);
 }
 
@@ -335,7 +337,7 @@ SourceLocation Lexer::getSourceLocation(const char *Loc) const {
   // the file id from FileLoc with the offset specified.
   unsigned CharNo = Loc-BufferStart;
   if (FileLoc.isFileID())
-    return SourceLocation::getFileLoc(FileLoc.getChunkID(), CharNo);
+    return FileLoc.getFileLocWithOffset(CharNo);
   
   // Otherwise, this is the _Pragma lexer case, which pretends that all of the
   // tokens are lexed from where the _Pragma was defined.
index 3f5a5a9d19dbef773805b8d9767a5ff10dc2c0ca..922af09e5006bfce958365f0318bc2a75a4fa55d 100644 (file)
@@ -156,11 +156,11 @@ void Preprocessor::Handle_Pragma(Token &Tok) {
   
   // Plop the string (including the newline and trailing null) into a buffer
   // where we can lex it.
-  SourceLocation TokLoc = CreateString(&StrVal[0], StrVal.size(), StrLoc);
+  SourceLocation TokLoc = CreateString(&StrVal[0], StrVal.size());
 
   // Make and enter a lexer object so that we lex and expand the tokens just
   // like any others.
-  Lexer *TL = Lexer::Create_PragmaLexer(TokLoc,
+  Lexer *TL = Lexer::Create_PragmaLexer(TokLoc, StrLoc,
                                         // do not include the null in the count.
                                         StrVal.size()-1, *this);
 
index 7e56a43c4401194c5799b8bb05585d8818baf717..82c4d926aee500ad21f79fdc1f75fa55483d4647 100644 (file)
@@ -388,13 +388,21 @@ bool TokenLexer::PasteTokens(Token &Tok) {
     } else {
       PP.IncrementPasteCounter(false);
       
-      // Make a lexer to lex this string from.
+      assert(ResultTokLoc.isFileID() &&
+             "Should be a raw location into scratch buffer");
       SourceManager &SourceMgr = PP.getSourceManager();
-      const char *ResultStrData = SourceMgr.getCharacterData(ResultTokLoc);
+      std::pair<FileID, unsigned> LocInfo =
+        SourceMgr.getDecomposedFileLoc(ResultTokLoc);
+      
+      const char *ScratchBufStart =SourceMgr.getBufferData(LocInfo.first).first;
+      
+      // Make a lexer to lex this string from.  Lex just this one token.
+      const char *ResultStrData = ScratchBufStart+LocInfo.second;
       
       // Make a lexer object so that we lex and expand the paste result.
-      Lexer TL(ResultTokLoc, PP.getLangOptions(), 
-               SourceMgr.getBufferData(ResultTokLoc).first,
+      Lexer TL(SourceMgr.getLocForStartOfFile(LocInfo.first),
+               PP.getLangOptions(), 
+               ScratchBufStart,
                ResultStrData, 
                ResultStrData+LHSLen+RHSLen /*don't include null*/);