[llvm] [X86] Reject a register where a memory operand displacement belongs (PR #216068)
Zane Hambly via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 21 22:00:04 PDT 2026
https://github.com/Zaneham updated https://github.com/llvm/llvm-project/pull/216068
>From b72f1f9f6b02d31c415beec1bc6d3689aacd68d6 Mon Sep 17 00:00:00 2001
From: ZaneHam <zanehambly at gmail.com>
Date: Thu, 13 Aug 2026 23:51:03 +1200
Subject: [PATCH] [X86] Reject a register where a memory operand displacement
belongs
---
llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp | 6 +++++-
llvm/test/MC/X86/x86_errors.s | 13 +++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
index f03b7408c8f30..be45659f144e0 100644
--- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -3210,7 +3210,11 @@ bool X86AsmParser::ParseMemOperand(MCRegister SegReg, const MCExpr *Disp,
if (!isAtMemOperand()) {
if (Parser.parseTokenLoc(Loc) || Parser.parseExpression(Disp, EndLoc))
return true;
- assert(!isa<X86MCExpr>(Disp) && "Expected non-register here.");
+ // A register here is a second segment override, or a register standing
+ // where the displacement belongs.
+ if (isa<X86MCExpr>(Disp))
+ return Error(Loc, "unexpected register in memory operand",
+ SMRange(Loc, EndLoc));
} else {
// Disp is implicitly zero if we haven't parsed it yet.
Disp = MCConstantExpr::create(0, Parser.getContext());
diff --git a/llvm/test/MC/X86/x86_errors.s b/llvm/test/MC/X86/x86_errors.s
index 543575f38815a..1f65b00dfc61c 100644
--- a/llvm/test/MC/X86/x86_errors.s
+++ b/llvm/test/MC/X86/x86_errors.s
@@ -201,3 +201,16 @@ pbndkb
// X86: error: register %r16d is only available in 64-bit mode
movl %eax, %r16d
+
+// X86: error: unexpected register in memory operand
+// X64: error: unexpected register in memory operand
+movl $0, %cs:%ds:(%eax)
+
+// X86: error: unexpected register in memory operand
+// X64: error: unexpected register in memory operand
+movl $0, %cs:%eax
+
+.set reg, %eax
+// X86: error: unexpected register in memory operand
+// X64: error: unexpected register in memory operand
+movl $0, ((reg))
More information about the llvm-commits
mailing list