diff options
author | Ilya Biryukov <ibiryukov@google.com> | 2019-05-17 09:32:05 +0000 |
---|---|---|
committer | Ilya Biryukov <ibiryukov@google.com> | 2019-05-17 09:32:05 +0000 |
commit | 929af67361275feafc07d02458af7657f754c029 (patch) | |
tree | 313270960fed57114ddafbab0af5e34292fd1fa5 /clang/lib/Lex/TokenLexer.cpp | |
parent | 30b2307da8b244f40d8ec55c0e6818281fb1935f (diff) | |
download | bcm5719-llvm-929af67361275feafc07d02458af7657f754c029.tar.gz bcm5719-llvm-929af67361275feafc07d02458af7657f754c029.zip |
[Lex] Allow to consume tokens while preprocessing
Summary:
By adding a hook to consume all tokens produced by the preprocessor.
The intention of this change is to make it possible to consume the
expanded tokens without re-runnig the preprocessor with minimal changes
to the preprocessor and minimal performance penalty when preprocessing
without recording the tokens.
The added hook is very low-level and reconstructing the expanded token
stream requires more work in the client code, the actual algorithm to
collect the tokens using this hook can be found in the follow-up change.
Reviewers: rsmith
Reviewed By: rsmith
Subscribers: eraman, nemanjai, kbarton, jsji, riccibruno, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D59885
llvm-svn: 361007
Diffstat (limited to 'clang/lib/Lex/TokenLexer.cpp')
-rw-r--r-- | clang/lib/Lex/TokenLexer.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/clang/lib/Lex/TokenLexer.cpp b/clang/lib/Lex/TokenLexer.cpp index 9d132a545c8..a7957e82e49 100644 --- a/clang/lib/Lex/TokenLexer.cpp +++ b/clang/lib/Lex/TokenLexer.cpp @@ -53,6 +53,7 @@ void TokenLexer::Init(Token &Tok, SourceLocation ELEnd, MacroInfo *MI, Tokens = &*Macro->tokens_begin(); OwnsTokens = false; DisableMacroExpansion = false; + IsReinject = false; NumTokens = Macro->tokens_end()-Macro->tokens_begin(); MacroExpansionStart = SourceLocation(); @@ -91,7 +92,9 @@ void TokenLexer::Init(Token &Tok, SourceLocation ELEnd, MacroInfo *MI, /// Create a TokenLexer for the specified token stream. This does not /// take ownership of the specified token vector. void TokenLexer::Init(const Token *TokArray, unsigned NumToks, - bool disableMacroExpansion, bool ownsTokens) { + bool disableMacroExpansion, bool ownsTokens, + bool isReinject) { + assert(!isReinject || disableMacroExpansion); // If the client is reusing a TokenLexer, make sure to free any memory // associated with it. destroy(); @@ -101,6 +104,7 @@ void TokenLexer::Init(const Token *TokArray, unsigned NumToks, Tokens = TokArray; OwnsTokens = ownsTokens; DisableMacroExpansion = disableMacroExpansion; + IsReinject = isReinject; NumTokens = NumToks; CurTokenIdx = 0; ExpandLocStart = ExpandLocEnd = SourceLocation(); @@ -647,6 +651,8 @@ bool TokenLexer::Lex(Token &Tok) { // Get the next token to return. Tok = Tokens[CurTokenIdx++]; + if (IsReinject) + Tok.setFlag(Token::IsReinjected); bool TokenIsFromPaste = false; |