From: Ted Kremenek Date: Tue, 18 Nov 2008 00:12:49 +0000 (+0000) Subject: - Add 'CurPPLexer' to Preprocessor to keep track of the current X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9c1b750c59d510e6c9eccb1f37bccc46ccfe6844;p=clang - Add 'CurPPLexer' to Preprocessor to keep track of the current 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 --- diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index e8bd3ac6d6..d87813da02 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -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 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 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 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(); } diff --git a/lib/Lex/PPLexerChange.cpp b/lib/Lex/PPLexerChange.cpp index 0b2211b107..3b63c9bb09 100644 --- a/lib/Lex/PPLexerChange.cpp +++ b/lib/Lex/PPLexerChange.cpp @@ -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.