Skip to content

Commit ea68b22

Browse files
authored
[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.
1 parent 27b4928 commit ea68b22

File tree

2 files changed

+43
-21
lines changed

2 files changed

+43
-21
lines changed

llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -523,13 +523,13 @@ static DecodeStatus decodeCSSPushPopchk(MCInst &Inst, uint32_t Insn,
523523
static DecodeStatus decodeRVCInstrRdRs1ImmZero(MCInst &Inst, uint32_t Insn,
524524
uint64_t Address,
525525
const MCDisassembler *Decoder) {
526+
DecodeStatus S = MCDisassembler::Success;
526527
uint32_t Rd = fieldFromInstruction(Insn, 7, 5);
527-
[[maybe_unused]] DecodeStatus Result =
528-
DecodeGPRNoX0RegisterClass(Inst, Rd, Address, Decoder);
529-
assert(Result == MCDisassembler::Success && "Invalid register");
528+
if (!Check(S, DecodeGPRNoX0RegisterClass(Inst, Rd, Address, Decoder)))
529+
return MCDisassembler::Fail;
530530
Inst.addOperand(Inst.getOperand(0));
531531
Inst.addOperand(MCOperand::createImm(0));
532-
return MCDisassembler::Success;
532+
return S;
533533
}
534534

535535
static DecodeStatus decodeCSSPushPopchk(MCInst &Inst, uint32_t Insn,
@@ -569,34 +569,44 @@ decodeRVCInstrRdRs1UImmLog2XLenNonZero(MCInst &Inst, uint32_t Insn,
569569
static DecodeStatus decodeRVCInstrRdRs2(MCInst &Inst, uint32_t Insn,
570570
uint64_t Address,
571571
const MCDisassembler *Decoder) {
572+
DecodeStatus S = MCDisassembler::Success;
572573
uint32_t Rd = fieldFromInstruction(Insn, 7, 5);
573574
uint32_t Rs2 = fieldFromInstruction(Insn, 2, 5);
574-
DecodeGPRRegisterClass(Inst, Rd, Address, Decoder);
575-
DecodeGPRRegisterClass(Inst, Rs2, Address, Decoder);
576-
return MCDisassembler::Success;
575+
if (!Check(S, DecodeGPRRegisterClass(Inst, Rd, Address, Decoder)))
576+
return MCDisassembler::Fail;
577+
if (!Check(S, DecodeGPRRegisterClass(Inst, Rs2, Address, Decoder)))
578+
return MCDisassembler::Fail;
579+
return S;
577580
}
578581

579582
static DecodeStatus decodeRVCInstrRdRs1Rs2(MCInst &Inst, uint32_t Insn,
580583
uint64_t Address,
581584
const MCDisassembler *Decoder) {
585+
DecodeStatus S = MCDisassembler::Success;
582586
uint32_t Rd = fieldFromInstruction(Insn, 7, 5);
583587
uint32_t Rs2 = fieldFromInstruction(Insn, 2, 5);
584-
DecodeGPRRegisterClass(Inst, Rd, Address, Decoder);
588+
if (!Check(S, DecodeGPRRegisterClass(Inst, Rd, Address, Decoder)))
589+
return MCDisassembler::Fail;
585590
Inst.addOperand(Inst.getOperand(0));
586-
DecodeGPRRegisterClass(Inst, Rs2, Address, Decoder);
587-
return MCDisassembler::Success;
591+
if (!Check(S, DecodeGPRRegisterClass(Inst, Rs2, Address, Decoder)))
592+
return MCDisassembler::Fail;
593+
return S;
588594
}
589595

590596
static DecodeStatus decodeXTHeadMemPair(MCInst &Inst, uint32_t Insn,
591597
uint64_t Address,
592598
const MCDisassembler *Decoder) {
599+
DecodeStatus S = MCDisassembler::Success;
593600
uint32_t Rd1 = fieldFromInstruction(Insn, 7, 5);
594601
uint32_t Rs1 = fieldFromInstruction(Insn, 15, 5);
595602
uint32_t Rd2 = fieldFromInstruction(Insn, 20, 5);
596603
uint32_t UImm2 = fieldFromInstruction(Insn, 25, 2);
597-
DecodeGPRRegisterClass(Inst, Rd1, Address, Decoder);
598-
DecodeGPRRegisterClass(Inst, Rd2, Address, Decoder);
599-
DecodeGPRRegisterClass(Inst, Rs1, Address, Decoder);
604+
if (!Check(S, DecodeGPRRegisterClass(Inst, Rd1, Address, Decoder)))
605+
return MCDisassembler::Fail;
606+
if (!Check(S, DecodeGPRRegisterClass(Inst, Rd2, Address, Decoder)))
607+
return MCDisassembler::Fail;
608+
if (!Check(S, DecodeGPRRegisterClass(Inst, Rs1, Address, Decoder)))
609+
return MCDisassembler::Fail;
600610
[[maybe_unused]] DecodeStatus Result =
601611
decodeUImmOperand<2>(Inst, UImm2, Address, Decoder);
602612
assert(Result == MCDisassembler::Success && "Invalid immediate");
@@ -610,7 +620,7 @@ static DecodeStatus decodeXTHeadMemPair(MCInst &Inst, uint32_t Insn,
610620
else
611621
Inst.addOperand(MCOperand::createImm(4));
612622

613-
return MCDisassembler::Success;
623+
return S;
614624
}
615625

616626
static DecodeStatus decodeZcmpRlist(MCInst &Inst, uint32_t Imm,

llvm/test/MC/RISCV/rve-invalid.s

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
1-
# RUN: not llvm-mc -triple riscv32 -mattr=+e < %s 2>&1 | FileCheck %s
2-
# RUN: llvm-mc -filetype=obj -triple=riscv32 < %s \
3-
# RUN: | llvm-objdump --mattr=+e -M no-aliases -d -r - \
1+
# RUN: not llvm-mc -triple riscv32 -mattr=+e,+zca < %s 2>&1 | FileCheck %s
2+
# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+zca < %s \
3+
# RUN: | llvm-objdump --mattr=+e,+zca -M no-aliases -d -r - \
44
# RUN: | FileCheck -check-prefix=CHECK-DIS %s
5-
# RUN: not llvm-mc -triple riscv64 -mattr=+e < %s 2>&1 | FileCheck %s
6-
# RUN: llvm-mc -filetype=obj -triple=riscv64 < %s \
7-
# RUN: | llvm-objdump --mattr=+e -M no-aliases -d -r - \
5+
# RUN: not llvm-mc -triple riscv64 -mattr=+e,+zca < %s 2>&1 | FileCheck %s
6+
# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+zca < %s \
7+
# RUN: | llvm-objdump --mattr=+e,+zca -M no-aliases -d -r - \
88
# RUN: | FileCheck -check-prefix=CHECK-DIS %s
99

1010
# Perform a simple check that registers x16-x31 (and the equivalent ABI names)
1111
# are rejected for RV32E/RV64E, when both assembling and disassembling.
1212

13-
13+
.option push
14+
.option exact
1415
# CHECK-DIS: 00001837 <unknown>
1516
# CHECK: :[[@LINE+1]]:5: error: invalid operand for instruction
1617
lui x16, 1
@@ -108,3 +109,14 @@ auipc t5, 31
108109
# CHECK-DIS: 00020f97 <unknown>
109110
# CHECK: :[[@LINE+1]]:7: error: invalid operand for instruction
110111
auipc t6, 32
112+
.option pop
113+
114+
# CHECK-DIS: 0f81 <unknown>
115+
# CHECK: :[[@LINE+1]]:8: error: register must be a GPR excluding zero (x0)
116+
c.addi x31, 0
117+
# CHECK-DIS: 9846 <unknown>
118+
# CHECK: :[[@LINE+1]]:7: error: register must be a GPR excluding zero (x0)
119+
c.add x16, x17
120+
# CHECK-DIS: 8046 <unknown>
121+
# CHECK: :[[@LINE+1]]:10: error: register must be a GPR excluding zero (x0)
122+
c.mv x0, x17

0 commit comments

Comments
 (0)