[llvm] [TableGen] Remove explicit recursion in LexToken (PR #143697)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 11 06:03:09 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-tablegen
Author: Jay Foad (jayfoad)
<details>
<summary>Changes</summary>
When profiling a Release+Asserts build of llvm-tblgen I noticed that it
was recursing hundreds of times to lex a sequence of hundreds of space
characters.
---
Full diff: https://github.com/llvm/llvm-project/pull/143697.diff
1 Files Affected:
- (modified) llvm/lib/TableGen/TGLexer.cpp (+11-9)
``````````diff
diff --git a/llvm/lib/TableGen/TGLexer.cpp b/llvm/lib/TableGen/TGLexer.cpp
index 46487cba9453e..5a3f86372beca 100644
--- a/llvm/lib/TableGen/TGLexer.cpp
+++ b/llvm/lib/TableGen/TGLexer.cpp
@@ -174,6 +174,7 @@ int TGLexer::peekNextChar(int Index) const {
}
tgtok::TokKind TGLexer::LexToken(bool FileOrLineStart) {
+restart:
TokStart = CurPtr;
// This always consumes at least one character.
int CurChar = getNextChar();
@@ -188,12 +189,12 @@ tgtok::TokKind TGLexer::LexToken(bool FileOrLineStart) {
return ReturnError(TokStart, "unexpected character");
case EOF:
// Lex next token, if we just left an include file.
- // Note that leaving an include file means that the next
- // symbol is located at the end of the 'include "..."'
- // construct, so LexToken() is called with default
- // false parameter.
- if (processEOF())
- return LexToken();
+ if (processEOF()) {
+ // Leaving an include file means that the next symbol is located at the
+ // end of the 'include "..."' construct.
+ FileOrLineStart = false;
+ goto restart;
+ }
// Return EOF denoting the end of lexing.
return tgtok::Eof;
@@ -238,10 +239,11 @@ tgtok::TokKind TGLexer::LexToken(bool FileOrLineStart) {
case ' ':
case '\t':
// Ignore whitespace.
- return LexToken(FileOrLineStart);
+ goto restart;
case '\n':
// Ignore whitespace, and identify the new line.
- return LexToken(true);
+ FileOrLineStart = true;
+ goto restart;
case '/':
// If this is the start of a // comment, skip until the end of the line or
// the end of the buffer.
@@ -252,7 +254,7 @@ tgtok::TokKind TGLexer::LexToken(bool FileOrLineStart) {
return tgtok::Error;
} else // Otherwise, this is an error.
return ReturnError(TokStart, "unexpected character");
- return LexToken(FileOrLineStart);
+ goto restart;
case '-': case '+':
case '0': case '1': case '2': case '3': case '4': case '5': case '6':
case '7': case '8': case '9': {
``````````
</details>
https://github.com/llvm/llvm-project/pull/143697
More information about the llvm-commits
mailing list