capstone_git/arch/
sparc.rs

1//! Contains sparc-specific types
2
3use core::convert::From;
4use core::{cmp, fmt, slice};
5
6// XXX todo(tmfink): create rusty versions
7pub use capstone_sys::sparc_insn_group as SparcInsnGroup;
8pub use capstone_sys::sparc_insn as SparcInsn;
9pub use capstone_sys::sparc_reg as SparcReg;
10pub use capstone_sys::sparc_cc as SparcCC;
11pub use capstone_sys::sparc_hint as SparcHint;
12use capstone_sys::{cs_sparc, cs_sparc_op, sparc_op_mem, sparc_op_type};
13
14pub use crate::arch::arch_builder::sparc::*;
15use crate::arch::DetailsArchInsn;
16use crate::instruction::{RegId, RegIdInt};
17
18
19/// Contains SPARC-specific details for an instruction
20pub struct SparcInsnDetail<'a>(pub(crate) &'a cs_sparc);
21
22/// SPARC operand
23#[derive(Clone, Debug, Eq, PartialEq)]
24pub enum SparcOperand {
25    /// Register
26    Reg(RegId),
27
28    /// Immediate
29    Imm(i64),
30
31    /// Memory
32    Mem(SparcOpMem),
33
34    /// Invalid
35    Invalid,
36}
37
38impl SparcInsnDetail<'_> {
39    /// Condition codes
40    pub fn cc(&self) -> SparcCC {
41        self.0.cc
42    }
43
44    /// Branch hint
45    pub fn hint(&self) -> SparcHint {
46        self.0.hint
47    }
48}
49
50impl_PartialEq_repr_fields!(SparcInsnDetail<'a> [ 'a ];
51    cc, hint, operands
52);
53
54impl Default for SparcOperand {
55    fn default() -> Self {
56        SparcOperand::Invalid
57    }
58}
59
60/// SPARC memory operand
61#[derive(Debug, Copy, Clone)]
62pub struct SparcOpMem(pub(crate) sparc_op_mem);
63
64impl SparcOpMem {
65    /// Base register
66    pub fn base(&self) -> RegId {
67        RegId(RegIdInt::from(self.0.base))
68    }
69
70    /// Index register
71    pub fn index(&self) -> RegId {
72        RegId(RegIdInt::from(self.0.index))
73    }
74
75    /// Disp value
76    pub fn disp(&self) -> i32 {
77        self.0.disp
78    }
79}
80
81impl_PartialEq_repr_fields!(SparcOpMem;
82    base, index, disp
83);
84
85impl cmp::Eq for SparcOpMem {}
86
87impl From<&cs_sparc_op> for SparcOperand {
88    fn from(insn: &cs_sparc_op) -> SparcOperand {
89        match insn.type_ {
90            sparc_op_type::SPARC_OP_REG => {
91                SparcOperand::Reg(RegId(unsafe { insn.__bindgen_anon_1.reg } as RegIdInt))
92            }
93            sparc_op_type::SPARC_OP_IMM => SparcOperand::Imm(unsafe { insn.__bindgen_anon_1.imm }),
94            sparc_op_type::SPARC_OP_MEM => {
95                SparcOperand::Mem(SparcOpMem(unsafe { insn.__bindgen_anon_1.mem }))
96            }
97            sparc_op_type::SPARC_OP_INVALID => SparcOperand::Invalid,
98        }
99    }
100}
101
102def_arch_details_struct!(
103    InsnDetail = SparcInsnDetail;
104    Operand = SparcOperand;
105    OperandIterator = SparcOperandIterator;
106    OperandIteratorLife = SparcOperandIterator<'a>;
107    [ pub struct SparcOperandIterator<'a>(slice::Iter<'a, cs_sparc_op>); ]
108    cs_arch_op = cs_sparc_op;
109    cs_arch = cs_sparc;
110);