diff options
author | Craig Topper <craig.topper@sifive.com> | 2025-03-31 20:49:51 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-31 20:49:51 -0700 |
commit | ea68b228816dfbe27f3e1ba1149116587758d56c (patch) | |
tree | 242cfbd37de5b3bc426fee17eb3e073fff577b03 /llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp | |
parent | 27b49288f7678d19cbda31904b6b5dbaa86124e7 (diff) | |
download | llvm-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.cpp | 38 |
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, |