Timm =?utf-8?q?Bäder?= <tbae...@redhat.com>, Timm =?utf-8?q?Bäder?= <tbae...@redhat.com>, Timm =?utf-8?q?Bäder?= <tbae...@redhat.com>, Timm =?utf-8?q?Bäder?= <tbae...@redhat.com>, Timm =?utf-8?q?Bäder?= <tbae...@redhat.com>, Timm =?utf-8?q?Bäder?= <tbae...@redhat.com>, Timm =?utf-8?q?Bäder?= <tbae...@redhat.com>, Timm =?utf-8?q?Bäder?= <tbae...@redhat.com>, Timm =?utf-8?q?Bäder?= <tbae...@redhat.com>, Timm =?utf-8?q?Bäder?= <tbae...@redhat.com> Message-ID: In-Reply-To: <llvm/llvm-project/pull/66514/cl...@github.com>
================ @@ -878,15 +879,46 @@ bool Preprocessor::HandleIdentifier(Token &Identifier) { return true; } +void Preprocessor::saveCheckPoint(const char *P) { + static constexpr ptrdiff_t Limit = 1000; + if (CheckPoints.empty()) { + CheckPoints.push_back(P); + return; + } + + const char *Cur = CheckPoints.back(); + if (Cur == P) + return; + if ((P - Cur) > Limit) + CheckPoints.push_back(P); +} + +const char *Preprocessor::getSaveFor(const char *S) const { + const char *C = S; + // FIXME: Use std::lower_bound or something smart. Aaron knows what I'm + // talking about. + for (ssize_t I = CheckPoints.size() - 1; I >= 0; --I) { + C = CheckPoints[I]; + if (CheckPoints[I] <= S) + break; + } + return C; +} + void Preprocessor::Lex(Token &Result) { ++LexLevel; // We loop here until a lex function returns a token; this avoids recursion. bool ReturnedToken; + // const char *Save = nullptr; do { switch (CurLexerKind) { case CLK_Lexer: ReturnedToken = CurLexer->Lex(Result); + if (ReturnedToken && CurLexer && + CurLexer->getFileID() == SourceMgr.getMainFileID()) { ---------------- tbaederr wrote: I guess we should be doing that for all files and not just the main file. https://github.com/llvm/llvm-project/pull/66514 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits