[llvm] MCParser: Move LCurly/RCurly testing into tokenIsStartOfStatement (PR #140101)

via llvm-commits llvm-commits at lists.llvm.org
Thu May 15 09:43:07 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-x86

Author: Fangrui Song (MaskRay)

<details>
<summary>Changes</summary>

Commit 8a0453e23abf27433b7539b2da2060d2df9fb39c (2015) added LCurly and
RCurly cases for Hexagon instruction bundles. While gas x86 also adopted
`{` in 2017 for pseudo prefixes (see `tc_symbol_chars`), `{` remains
uncommon among targets. Move `{` and `}` parsing into the newly
introduced `tokenIsStartOfStatement` hook (#<!-- -->137997).


---
Full diff: https://github.com/llvm/llvm-project/pull/140101.diff


4 Files Affected:

- (modified) llvm/lib/MC/MCParser/AsmParser.cpp (-9) 
- (modified) llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp (+5) 
- (modified) llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp (+4) 
- (added) llvm/test/MC/AsmParser/token.s (+7) 


``````````diff
diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp
index f27a27833858a..857985199cc48 100644
--- a/llvm/lib/MC/MCParser/AsmParser.cpp
+++ b/llvm/lib/MC/MCParser/AsmParser.cpp
@@ -1760,15 +1760,6 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info,
     // Treat '.' as a valid identifier in this context.
     Lex();
     IDVal = ".";
-  } else if (Lexer.is(AsmToken::LCurly)) {
-    // Treat '{' as a valid identifier in this context.
-    Lex();
-    IDVal = "{";
-
-  } else if (Lexer.is(AsmToken::RCurly)) {
-    // Treat '}' as a valid identifier in this context.
-    Lex();
-    IDVal = "}";
   } else if (getTargetParser().tokenIsStartOfStatement(ID.getKind())) {
     Lex();
     IDVal = ID.getString();
diff --git a/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp b/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp
index 686e1609c376d..1c9fb8f0a42ae 100644
--- a/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp
+++ b/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp
@@ -110,6 +110,7 @@ class HexagonAsmParser : public MCTargetAsmParser {
 
   bool equalIsAsmAssignment() override { return false; }
   bool isLabel(AsmToken &Token) override;
+  bool tokenIsStartOfStatement(AsmToken::TokenKind Token) override;
 
   void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); }
   bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); }
@@ -1007,6 +1008,10 @@ bool HexagonAsmParser::isLabel(AsmToken &Token) {
   return false;
 }
 
+bool HexagonAsmParser::tokenIsStartOfStatement(AsmToken::TokenKind Token) {
+  return Token == AsmToken::LCurly || Token == AsmToken::RCurly;
+}
+
 bool HexagonAsmParser::handleNoncontigiousRegister(bool Contigious,
                                                    SMLoc &Loc) {
   if (!Contigious && ErrorNoncontigiousRegister) {
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
index 642a9cff4853c..11193304a785d 100644
--- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -124,6 +124,10 @@ class X86AsmParser : public MCTargetAsmParser {
     return Result;
   }
 
+  bool tokenIsStartOfStatement(AsmToken::TokenKind Token) override {
+    return Token == AsmToken::LCurly;
+  }
+
   X86TargetStreamer &getTargetStreamer() {
     assert(getParser().getStreamer().getTargetStreamer() &&
            "do not have a target streamer");
diff --git a/llvm/test/MC/AsmParser/token.s b/llvm/test/MC/AsmParser/token.s
new file mode 100644
index 0000000000000..c162e8336a2d7
--- /dev/null
+++ b/llvm/test/MC/AsmParser/token.s
@@ -0,0 +1,7 @@
+## Tested invalid statement start tokens. X86 supports "{". Use a different target.
+# REQUIRES: aarch64-registered-target
+
+# RUN: not llvm-mc -triple=aarch64 %s 2>&1 | FileCheck %s
+
+# CHECK: [[#@LINE+1]]:2: error: unexpected token at start of statement
+ {insn}

``````````

</details>


https://github.com/llvm/llvm-project/pull/140101


More information about the llvm-commits mailing list