aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@sifive.com>2025-03-31 20:49:51 -0700
committerGitHub <noreply@github.com>2025-03-31 20:49:51 -0700
commitea68b228816dfbe27f3e1ba1149116587758d56c (patch)
tree242cfbd37de5b3bc426fee17eb3e073fff577b03 /llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
parent27b49288f7678d19cbda31904b6b5dbaa86124e7 (diff)
downloadllvm-ea68b228816dfbe27f3e1ba1149116587758d56c.zip
llvm-ea68b228816dfbe27f3e1ba1149116587758d56c.tar.gz
llvm-ea68b228816dfbe27f3e1ba1149116587758d56c.tar.bz2
[RISCV] Prevent disassembling RVC hint instructions with x16-x31 for RVE. (#133805)
We can't ignore the return value form the GPR decode function, as it contains the RVE check.
Diffstat (limited to 'llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp')
-rw-r--r--llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp38
1 files changed, 24 insertions, 14 deletions
diff --git a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
index cda34ac..4e6d2b6 100644
--- a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
+++ b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
@@ -523,13 +523,13 @@ static DecodeStatus decodeCSSPushPopchk(MCInst &Inst, uint32_t Insn,
static DecodeStatus decodeRVCInstrRdRs1ImmZero(MCInst &Inst, uint32_t Insn,
uint64_t Address,
const MCDisassembler *Decoder) {
+ DecodeStatus S = MCDisassembler::Success;
uint32_t Rd = fieldFromInstruction(Insn, 7, 5);
- [[maybe_unused]] DecodeStatus Result =
- DecodeGPRNoX0RegisterClass(Inst, Rd, Address, Decoder);
- assert(Result == MCDisassembler::Success && "Invalid register");
+ if (!Check(S, DecodeGPRNoX0RegisterClass(Inst, Rd, Address, Decoder)))
+ return MCDisassembler::Fail;
Inst.addOperand(Inst.getOperand(0));
Inst.addOperand(MCOperand::createImm(0));
- return MCDisassembler::Success;
+ return S;
}
static DecodeStatus decodeCSSPushPopchk(MCInst &Inst, uint32_t Insn,
@@ -569,34 +569,44 @@ decodeRVCInstrRdRs1UImmLog2XLenNonZero(MCInst &Inst, uint32_t Insn,
static DecodeStatus decodeRVCInstrRdRs2(MCInst &Inst, uint32_t Insn,
uint64_t Address,
const MCDisassembler *Decoder) {
+ DecodeStatus S = MCDisassembler::Success;
uint32_t Rd = fieldFromInstruction(Insn, 7, 5);
uint32_t Rs2 = fieldFromInstruction(Insn, 2, 5);
- DecodeGPRRegisterClass(Inst, Rd, Address, Decoder);
- DecodeGPRRegisterClass(Inst, Rs2, Address, Decoder);
- return MCDisassembler::Success;
+ if (!Check(S, DecodeGPRRegisterClass(Inst, Rd, Address, Decoder)))
+ return MCDisassembler::Fail;
+ if (!Check(S, DecodeGPRRegisterClass(Inst, Rs2, Address, Decoder)))
+ return MCDisassembler::Fail;
+ return S;
}
static DecodeStatus decodeRVCInstrRdRs1Rs2(MCInst &Inst, uint32_t Insn,
uint64_t Address,
const MCDisassembler *Decoder) {
+ DecodeStatus S = MCDisassembler::Success;
uint32_t Rd = fieldFromInstruction(Insn, 7, 5);
uint32_t Rs2 = fieldFromInstruction(Insn, 2, 5);
- DecodeGPRRegisterClass(Inst, Rd, Address, Decoder);
+ if (!Check(S, DecodeGPRRegisterClass(Inst, Rd, Address, Decoder)))
+ return MCDisassembler::Fail;
Inst.addOperand(Inst.getOperand(0));
- DecodeGPRRegisterClass(Inst, Rs2, Address, Decoder);
- return MCDisassembler::Success;
+ if (!Check(S, DecodeGPRRegisterClass(Inst, Rs2, Address, Decoder)))
+ return MCDisassembler::Fail;
+ return S;
}
static DecodeStatus decodeXTHeadMemPair(MCInst &Inst, uint32_t Insn,
uint64_t Address,
const MCDisassembler *Decoder) {
+ DecodeStatus S = MCDisassembler::Success;
uint32_t Rd1 = fieldFromInstruction(Insn, 7, 5);
uint32_t Rs1 = fieldFromInstruction(Insn, 15, 5);
uint32_t Rd2 = fieldFromInstruction(Insn, 20, 5);
uint32_t UImm2 = fieldFromInstruction(Insn, 25, 2);
- DecodeGPRRegisterClass(Inst, Rd1, Address, Decoder);
- DecodeGPRRegisterClass(Inst, Rd2, Address, Decoder);
- DecodeGPRRegisterClass(Inst, Rs1, Address, Decoder);
+ if (!Check(S, DecodeGPRRegisterClass(Inst, Rd1, Address, Decoder)))
+ return MCDisassembler::Fail;
+ if (!Check(S, DecodeGPRRegisterClass(Inst, Rd2, Address, Decoder)))
+ return MCDisassembler::Fail;
+ if (!Check(S, DecodeGPRRegisterClass(Inst, Rs1, Address, Decoder)))
+ return MCDisassembler::Fail;
[[maybe_unused]] DecodeStatus Result =
decodeUImmOperand<2>(Inst, UImm2, Address, Decoder);
assert(Result == MCDisassembler::Success && "Invalid immediate");
@@ -610,7 +620,7 @@ static DecodeStatus decodeXTHeadMemPair(MCInst &Inst, uint32_t Insn,
else
Inst.addOperand(MCOperand::createImm(4));
- return MCDisassembler::Success;
+ return S;
}
static DecodeStatus decodeZcmpRlist(MCInst &Inst, uint32_t Imm,