capstone_git/arch/
riscv.rs1use core::convert::From;
4use core::{cmp, fmt, slice};
5
6pub use capstone_sys::riscv_insn_group as RiscVInsnGroup;
8pub use capstone_sys::riscv_insn as RiscVInsn;
9pub use capstone_sys::riscv_reg as RiscVReg;
10use capstone_sys::{cs_riscv, cs_riscv_op, riscv_op_mem, riscv_op_type};
11
12pub use crate::arch::arch_builder::riscv::*;
13use crate::arch::DetailsArchInsn;
14use crate::instruction::{RegId, RegIdInt};
15
16pub struct RiscVInsnDetail<'a>(pub(crate) &'a cs_riscv);
18
19impl_PartialEq_repr_fields!(RiscVInsnDetail<'a> [ 'a ];
20 operands
21);
22
23#[derive(Clone, Debug, Eq, PartialEq)]
25pub enum RiscVOperand {
26 Reg(RegId),
28
29 Imm(i64),
31
32 Mem(RiscVOpMem),
34
35 Invalid,
37}
38
39impl Default for RiscVOperand {
40 fn default() -> Self {
41 RiscVOperand::Invalid
42 }
43}
44
45#[derive(Debug, Copy, Clone)]
47pub struct RiscVOpMem(pub(crate) riscv_op_mem);
48
49impl RiscVOpMem {
50 pub fn base(&self) -> RegId {
52 RegId(self.0.base as RegIdInt)
53 }
54
55 pub fn disp(&self) -> i64 {
57 self.0.disp
58 }
59}
60
61impl_PartialEq_repr_fields!(RiscVOpMem;
62 base, disp
63);
64
65impl cmp::Eq for RiscVOpMem {}
66
67impl From<&cs_riscv_op> for RiscVOperand {
68 fn from(insn: &cs_riscv_op) -> RiscVOperand {
69 match insn.type_ {
70 riscv_op_type::RISCV_OP_REG => {
71 RiscVOperand::Reg(RegId(unsafe { insn.__bindgen_anon_1.reg } as RegIdInt))
72 }
73 riscv_op_type::RISCV_OP_IMM => RiscVOperand::Imm(unsafe { insn.__bindgen_anon_1.imm }),
74 riscv_op_type::RISCV_OP_MEM => {
75 RiscVOperand::Mem(RiscVOpMem(unsafe { insn.__bindgen_anon_1.mem }))
76 }
77 riscv_op_type::RISCV_OP_INVALID => RiscVOperand::Invalid,
78 }
79 }
80}
81
82def_arch_details_struct!(
83 InsnDetail = RiscVInsnDetail;
84 Operand = RiscVOperand;
85 OperandIterator = RiscVOperandIterator;
86 OperandIteratorLife = RiscVOperandIterator<'a>;
87 [ pub struct RiscVOperandIterator<'a>(slice::Iter<'a, cs_riscv_op>); ]
88 cs_arch_op = cs_riscv_op;
89 cs_arch = cs_riscv;
90);