[llvm] [MC][Mips] Fix wrong assumption about `Immediate` operand. (PR #119056)

Romain Thomas via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 6 22:55:56 PST 2024


https://github.com/romainthomas created https://github.com/llvm/llvm-project/pull/119056

While trying to evaluate the branch of this MIPS (EL) non-branch instruction: `ldxc1 $f2, $4($7)` the function fails on the assert: `assert(isImm() && ...)`.

This commit ensures that the operand is an immediate before accessing the value.

- Triple: `mipsel-unknown-linux-gnu-elf` with '+mips32r2'
- Instruction: `ldxc1 $f2, $4($7)`
- Raw instruction: `0x81, 0x0, 0xe4, 0x4c`

>From d0b9d784e2e1257eeab6c8a52f4845a10ae151f6 Mon Sep 17 00:00:00 2001
From: Romain Thomas <me at romainthomas.fr>
Date: Sat, 7 Dec 2024 07:51:32 +0100
Subject: [PATCH] [MC][Mips] Fix wrong assumption about `Immediate` operand.

While trying to evaluate the branch of this MIPS (EL) non-branch
instruction: `ldxc1 $f2, $4($7)` the function fails on the assert:
`assert(isImm() && ...)`.

This commit ensures that the operand is an immediate before accessing the
value.

- Triple: `mipsel-unknown-linux-gnu-elf` with '+mips32r2'
- Instruction: `ldxc1 $f2, $4($7)`
- Raw instruction: `0x81, 0x0, 0xe4, 0x4c`
---
 llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp
index 3b655363ce26fe..4b38ce70c33163 100644
--- a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp
+++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp
@@ -143,10 +143,13 @@ class MipsMCInstrAnalysis : public MCInstrAnalysis {
     switch (Info->get(Inst.getOpcode()).operands()[NumOps - 1].OperandType) {
     case MCOI::OPERAND_UNKNOWN:
     case MCOI::OPERAND_IMMEDIATE: {
+      const MCOperand& Op = Inst.getOperand(NumOps - 1);
+      if (!Op.isImm())
+        return false;
       // j, jal, jalx, jals
       // Absolute branch within the current 256 MB-aligned region
       uint64_t Region = Addr & ~uint64_t(0xfffffff);
-      Target = Region + Inst.getOperand(NumOps - 1).getImm();
+      Target = Region + Op.getImm();
       return true;
     }
     case MCOI::OPERAND_PCREL:



More information about the llvm-commits mailing list