]> granicus.if.org Git - clang/commitdiff
- Add 'CurPPLexer' to Preprocessor to keep track of the current
authorTed Kremenek <kremenek@apple.com>
Tue, 18 Nov 2008 00:12:49 +0000 (00:12 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 18 Nov 2008 00:12:49 +0000 (00:12 +0000)
  PreprocessorLexer, which will either be a 'Lexer' or 'PTHLexer'.
- Added stub field 'CurPTHLexer' to keep track of the current PTHLexer.
- Modified IncludeStackInfo to track both the current PTHLexer and
  current PreprocessorLexer.

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

include/clang/Lex/Preprocessor.h
lib/Lex/PPLexerChange.cpp

index e8bd3ac6d6cdc81239ebad806e03a37b106a73c8..d87813da0268a1f1de8882e7004ed01f375dc730 100644 (file)
@@ -15,6 +15,7 @@
 #define LLVM_CLANG_LEX_PREPROCESSOR_H
 
 #include "clang/Lex/Lexer.h"
+#include "clang/Lex/PTHLexer.h"
 #include "clang/Lex/PPCallbacks.h"
 #include "clang/Lex/TokenLexer.h"
 #include "clang/Basic/IdentifierTable.h"
@@ -93,9 +94,20 @@ class Preprocessor {
   PragmaNamespace *PragmaHandlers;
   
   /// CurLexer - This is the current top of the stack that we're lexing from if
-  /// not expanding a macro.  One of CurLexer and CurTokenLexer must be null.
+  /// not expanding a macro and we are lexing directly from source code.
+  ///  Only one of CurLexer, CurPTHLexer, or CurTokenLexer will be non-null.
   llvm::OwningPtr<Lexer> CurLexer;
   
+  /// CurPTHLexer - This is the current top of stack that we're lexing from if
+  ///  not expanding from a macro and we are lexing from a PTH cache.
+  ///  Only one of CurLexer, CurPTHLexer, or CurTokenLexer will be non-null.
+  llvm::OwningPtr<PTHLexer> CurPTHLexer;
+  
+  /// CurPPLexer - This is the current top of the stack what we're lexing from
+  ///  if not expanding a macro.  This is an alias for either CurLexer or
+  ///  CurPTHLexer.
+  PreprocessorLexer* CurPPLexer;
+  
   /// CurLookup - The DirectoryLookup structure used to find the current
   /// FileEntry, if CurLexer is non-null and if applicable.  This allows us to
   /// implement #include_next and find directory-specific properties.
@@ -109,12 +121,16 @@ class Preprocessor {
   /// #included, and macros currently being expanded from, not counting
   /// CurLexer/CurTokenLexer.
   struct IncludeStackInfo {
-    Lexer *TheLexer;
+    Lexer                 *TheLexer;
+    PTHLexer              *ThePTHLexer;
+    PreprocessorLexer     *ThePPLexer;
+    TokenLexer            *TheTokenLexer;    
     const DirectoryLookup *TheDirLookup;
-    TokenLexer *TheTokenLexer;
-    IncludeStackInfo(Lexer *L, const DirectoryLookup *D, TokenLexer *TL)
-      : TheLexer(L), TheDirLookup(D), TheTokenLexer(TL) {
-    }
+
+    IncludeStackInfo(Lexer *L, PTHLexer* P, PreprocessorLexer* PPL,
+                     TokenLexer* TL, const DirectoryLookup *D)
+      : TheLexer(L), ThePTHLexer(P), ThePPLexer(PPL), TheTokenLexer(TL),
+        TheDirLookup(D) {}
   };
   std::vector<IncludeStackInfo> IncludeMacroStack;
   
@@ -485,14 +501,19 @@ public:
 private:
   
   void PushIncludeMacroStack() {
-    IncludeMacroStack.push_back(IncludeStackInfo(CurLexer.take(), CurDirLookup,
-                                                 CurTokenLexer.take()));
+    IncludeMacroStack.push_back(IncludeStackInfo(CurLexer.take(),
+                                                 CurPTHLexer.take(),
+                                                 CurPPLexer,
+                                                 CurTokenLexer.take(),
+                                                 CurDirLookup));
   }
   
   void PopIncludeMacroStack() {
     CurLexer.reset(IncludeMacroStack.back().TheLexer);
-    CurDirLookup  = IncludeMacroStack.back().TheDirLookup;
+    CurPTHLexer.reset(IncludeMacroStack.back().ThePTHLexer);
+    CurPPLexer = IncludeMacroStack.back().ThePPLexer;
     CurTokenLexer.reset(IncludeMacroStack.back().TheTokenLexer);
+    CurDirLookup  = IncludeMacroStack.back().TheDirLookup;
     IncludeMacroStack.pop_back();
   }
   
index 0b2211b107f47ab7e5c1a04d0cfbb225f9cbb907..3b63c9bb094cf24ea10f28adcac281c7035d442d 100644 (file)
@@ -89,6 +89,7 @@ void Preprocessor::EnterSourceFileWithLexer(Lexer *TheLexer,
     PushIncludeMacroStack();
 
   CurLexer.reset(TheLexer);
+  CurPPLexer = TheLexer;
   CurDirLookup = CurDir;
   
   // Notify the client, if desired, that we are in a new source file.