summaryrefslogtreecommitdiff
path: root/rust/src/mlil/operation.rs
diff options
context:
space:
mode:
authorMichael Krasnitski <michael.krasnitski@gmail.com>2024-02-07 13:15:34 -0500
committerKyle Martin <krm504@nyu.edu>2024-03-18 17:46:37 -0400
commitb6897fab3eddcb94ebae211913253246f0407377 (patch)
treefd8bb3918a505b799a76ada02aa7e227ccdea760 /rust/src/mlil/operation.rs
parent5fcf6bc59ebc2110d053360d223e6570cdd2272c (diff)
Instantiate `MediumLevelILInstruction` inline and remove constructors
Diffstat (limited to 'rust/src/mlil/operation.rs')
-rw-r--r--rust/src/mlil/operation.rs437
1 files changed, 4 insertions, 433 deletions
diff --git a/rust/src/mlil/operation.rs b/rust/src/mlil/operation.rs
index 544fe275..9b3a4a70 100644
--- a/rust/src/mlil/operation.rs
+++ b/rust/src/mlil/operation.rs
@@ -58,7 +58,7 @@ impl Iterator for OperandIter {
} else {
// Will short-circuit and return `None` once iter is exhausted
let iter_idx = self.next_iter_idx?;
- let node = unsafe { BNGetMediumLevelILByIndex(self.function.handle, iter_idx) };
+ let node = get_raw_operation(&self.function, iter_idx);
assert_eq!(node.operation, BNMediumLevelILOperation::MLIL_UNDEF);
let next = if self.remaining > 4 {
@@ -183,7 +183,7 @@ impl ExactSizeIterator for OperandSSAVarIter {
}
}
-fn get_float(value: u64, size: usize) -> f64 {
+pub(super) fn get_float(value: u64, size: usize) -> f64 {
match size {
4 => f32::from_bits(value as u32) as f64,
8 => f64::from_bits(value),
@@ -213,11 +213,11 @@ fn get_raw_operation(function: &MediumLevelILFunction, idx: usize) -> BNMediumLe
unsafe { BNGetMediumLevelILByIndex(function.handle, idx) }
}
-fn get_var(id: u64) -> Variable {
+pub(super) fn get_var(id: u64) -> Variable {
unsafe { Variable::from_raw(BNFromVariableIdentifier(id)) }
}
-fn get_var_ssa(id: u64, version: usize) -> SSAVariable {
+pub(super) fn get_var_ssa(id: u64, version: usize) -> SSAVariable {
SSAVariable::new(get_var(id), version)
}
@@ -261,39 +261,18 @@ pub struct LiftedIf {
pub dest_true: u64,
pub dest_false: u64,
}
-impl MediumLevelILOperationIf {
- pub(crate) fn new(condition: usize, dest_true: u64, dest_false: u64) -> Self {
- Self {
- condition,
- dest_true,
- dest_false,
- }
- }
-}
// FLOAT_CONST
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct FloatConst {
pub constant: f64,
}
-impl FloatConst {
- pub(crate) fn new(constant: u64, size: usize) -> Self {
- Self {
- constant: get_float(constant, size),
- }
- }
-}
// CONST, CONST_PTR, IMPORT
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
pub struct Constant {
pub constant: u64,
}
-impl Constant {
- pub(crate) fn new(constant: u64) -> Self {
- Self { constant }
- }
-}
// EXTERN_PTR
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
@@ -301,11 +280,6 @@ pub struct ExternPtr {
pub constant: u64,
pub offset: u64,
}
-impl ExternPtr {
- pub(crate) fn new(constant: u64, offset: u64) -> Self {
- Self { constant, offset }
- }
-}
// CONST_DATA
#[derive(Copy, Clone)]
@@ -318,15 +292,6 @@ pub struct ConstantData {
pub struct LiftedConstantData {
pub constant_data: types::ConstantData,
}
-impl ConstantData {
- pub(crate) fn new(constant_data_kind: u32, constant_data_value: i64, size: usize) -> Self {
- Self {
- constant_data_kind,
- constant_data_value,
- size,
- }
- }
-}
// JUMP, RET_HINT
#[derive(Copy, Clone)]
@@ -337,11 +302,6 @@ pub struct Jump {
pub struct LiftedJump {
pub dest: Box<MediumLevelILLiftedInstruction>,
}
-impl Jump {
- pub(crate) fn new(dest: usize) -> Self {
- Self { dest }
- }
-}
// STORE_SSA
#[derive(Copy, Clone)]
@@ -358,16 +318,6 @@ pub struct LiftedStoreSsa {
pub src_memory: u64,
pub src: Box<MediumLevelILLiftedInstruction>,
}
-impl StoreSsa {
- pub(crate) fn new(dest: usize, dest_memory: u64, src_memory: u64, src: usize) -> Self {
- Self {
- dest,
- dest_memory,
- src_memory,
- src,
- }
- }
-}
// STORE_STRUCT_SSA
#[derive(Copy, Clone)]
@@ -386,23 +336,6 @@ pub struct LiftedStoreStructSsa {
pub src_memory: u64,
pub src: Box<MediumLevelILLiftedInstruction>,
}
-impl StoreStructSsa {
- pub(crate) fn new(
- dest: usize,
- offset: u64,
- dest_memory: u64,
- src_memory: u64,
- src: usize,
- ) -> Self {
- Self {
- dest,
- offset,
- dest_memory,
- src_memory,
- src,
- }
- }
-}
// STORE_STRUCT
#[derive(Copy, Clone)]
@@ -417,11 +350,6 @@ pub struct LiftedStoreStruct {
pub offset: u64,
pub src: Box<MediumLevelILLiftedInstruction>,
}
-impl StoreStruct {
- pub(crate) fn new(dest: usize, offset: u64, src: usize) -> Self {
- Self { dest, offset, src }
- }
-}
// STORE
#[derive(Copy, Clone)]
@@ -434,11 +362,6 @@ pub struct LiftedStore {
pub dest: Box<MediumLevelILLiftedInstruction>,
pub src: Box<MediumLevelILLiftedInstruction>,
}
-impl Store {
- pub(crate) fn new(dest: usize, src: usize) -> Self {
- Self { dest, src }
- }
-}
// JUMP_TO
#[derive(Copy, Clone)]
@@ -452,39 +375,18 @@ pub struct LiftedJumpTo {
pub dest: Box<MediumLevelILLiftedInstruction>,
pub targets: HashMap<u64, u64>,
}
-impl JumpTo {
- pub(crate) fn new(dest: usize, num_operands: usize, first_operand: usize) -> Self {
- Self {
- dest,
- first_operand,
- num_operands,
- }
- }
-}
// GOTO
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
pub struct Goto {
pub dest: u64,
}
-impl Goto {
- pub(crate) fn new(dest: u64) -> Self {
- Self { dest }
- }
-}
// FREE_VAR_SLOT
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
pub struct FreeVarSlot {
pub dest: Variable,
}
-impl FreeVarSlot {
- pub(crate) fn new(dest: u64) -> Self {
- Self {
- dest: get_var(dest),
- }
- }
-}
// SET_VAR_FIELD
#[derive(Copy, Clone)]
@@ -499,15 +401,6 @@ pub struct LiftedSetVarField {
pub offset: u64,
pub src: Box<MediumLevelILLiftedInstruction>,
}
-impl SetVarField {
- pub(crate) fn new(dest: u64, offset: u64, src: usize) -> Self {
- Self {
- dest: get_var(dest),
- offset,
- src,
- }
- }
-}
// SET_VAR
#[derive(Copy, Clone)]
@@ -520,14 +413,6 @@ pub struct LiftedSetVar {
pub dest: Variable,
pub src: Box<MediumLevelILLiftedInstruction>,
}
-impl SetVar {
- pub(crate) fn new(dest: u64, src: usize) -> Self {
- Self {
- dest: get_var(dest),
- src,
- }
- }
-}
// FREE_VAR_SLOT_SSA
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
@@ -535,14 +420,6 @@ pub struct FreeVarSlotSsa {
pub dest: SSAVariable,
pub prev: SSAVariable,
}
-impl FreeVarSlotSsa {
- pub(crate) fn new(dest: (u64, usize), prev: (u64, usize)) -> Self {
- Self {
- dest: get_var_ssa(dest.0, dest.1),
- prev: get_var_ssa(prev.0, prev.1),
- }
- }
-}
// SET_VAR_SSA_FIELD, SET_VAR_ALIASED_FIELD
#[derive(Copy, Clone)]
@@ -559,16 +436,6 @@ pub struct LiftedSetVarSsaField {
pub offset: u64,
pub src: Box<MediumLevelILLiftedInstruction>,
}
-impl SetVarSsaField {
- pub(crate) fn new(dest: (u64, usize), prev: (u64, usize), offset: u64, src: usize) -> Self {
- Self {
- dest: get_var_ssa(dest.0, dest.1),
- prev: get_var_ssa(prev.0, prev.1),
- offset,
- src,
- }
- }
-}
// SET_VAR_ALIASED
#[derive(Copy, Clone)]
@@ -583,15 +450,6 @@ pub struct LiftedSetVarAliased {
pub prev: SSAVariable,
pub src: Box<MediumLevelILLiftedInstruction>,
}
-impl SetVarAliased {
- pub(crate) fn new(dest: (u64, usize), prev: (u64, usize), src: usize) -> Self {
- Self {
- dest: get_var_ssa(dest.0, dest.1),
- prev: get_var_ssa(prev.0, prev.1),
- src,
- }
- }
-}
// SET_VAR_SSA
#[derive(Copy, Clone)]
@@ -604,14 +462,6 @@ pub struct LiftedSetVarSsa {
pub dest: SSAVariable,
pub src: Box<MediumLevelILLiftedInstruction>,
}
-impl SetVarSsa {
- pub(crate) fn new(dest: (u64, usize), src: usize) -> Self {
- Self {
- dest: get_var_ssa(dest.0, dest.1),
- src,
- }
- }
-}
// VAR_PHI
#[derive(Copy, Clone)]
@@ -625,15 +475,6 @@ pub struct LiftedVarPhi {
pub dest: SSAVariable,
pub src: Vec<SSAVariable>,
}
-impl VarPhi {
- pub(crate) fn new(dest: (u64, usize), num_operands: usize, first_operand: usize) -> Self {
- Self {
- dest: get_var_ssa(dest.0, dest.1),
- first_operand,
- num_operands,
- }
- }
-}
// MEM_PHI
#[derive(Copy, Clone)]
@@ -647,15 +488,6 @@ pub struct LiftedMemPhi {
pub dest_memory: u64,
pub src_memory: Vec<u64>,
}
-impl MemPhi {
- pub(crate) fn new(dest_memory: u64, num_operands: usize, first_operand: usize) -> Self {
- Self {
- dest_memory,
- first_operand,
- num_operands,
- }
- }
-}
// VAR_SPLIT
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
@@ -663,14 +495,6 @@ pub struct VarSplit {
pub high: Variable,
pub low: Variable,
}
-impl VarSplit {
- pub(crate) fn new(high: u64, low: u64) -> Self {
- Self {
- high: get_var(high),
- low: get_var(low),
- }
- }
-}
// SET_VAR_SPLIT
#[derive(Copy, Clone)]
@@ -685,15 +509,6 @@ pub struct LiftedSetVarSplit {
pub low: Variable,
pub src: Box<MediumLevelILLiftedInstruction>,
}
-impl SetVarSplit {
- pub(crate) fn new(high: u64, low: u64, src: usize) -> Self {
- Self {
- high: get_var(high),
- low: get_var(low),
- src,
- }
- }
-}
// VAR_SPLIT_SSA
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
@@ -701,14 +516,6 @@ pub struct VarSplitSsa {
pub high: SSAVariable,
pub low: SSAVariable,
}
-impl VarSplitSsa {
- pub(crate) fn new(high: (u64, usize), low: (u64, usize)) -> Self {
- Self {
- high: get_var_ssa(high.0, high.1),
- low: get_var_ssa(low.0, low.1),
- }
- }
-}
// SET_VAR_SPLIT_SSA
#[derive(Copy, Clone)]
@@ -723,15 +530,6 @@ pub struct LiftedSetVarSplitSsa {
pub low: SSAVariable,
pub src: Box<MediumLevelILLiftedInstruction>,
}
-impl SetVarSplitSsa {
- pub(crate) fn new(high: (u64, usize), low: (u64, usize), src: usize) -> Self {
- Self {
- high: get_var_ssa(high.0, high.1),
- low: get_var_ssa(low.0, low.1),
- src,
- }
- }
-}
// ADD, SUB, AND, OR, XOR, LSL, LSR, ASR, ROL, ROR, MUL, MULU_DP, MULS_DP, DIVU, DIVU_DP, DIVS, DIVS_DP, MODU, MODU_DP, MODS, MODS_DP, CMP_E, CMP_NE, CMP_SLT, CMP_ULT, CMP_SLE, CMP_ULE, CMP_SGE, CMP_UGE, CMP_SGT, CMP_UGT, TEST_BIT, ADD_OVERFLOW, FCMP_E, FCMP_NE, FCMP_LT, FCMP_LE, FCMP_GE, FCMP_GT, FCMP_O, FCMP_UO, FADD, FSUB, FMUL, FDIV
#[derive(Copy, Clone)]
@@ -744,11 +542,6 @@ pub struct LiftedBinaryOp {
pub left: Box<MediumLevelILLiftedInstruction>,
pub right: Box<MediumLevelILLiftedInstruction>,
}
-impl BinaryOp {
- pub(crate) fn new(left: usize, right: usize) -> Self {
- Self { left, right }
- }
-}
// ADC, SBB, RLC, RRC
#[derive(Copy, Clone)]
@@ -763,11 +556,6 @@ pub struct LiftedBinaryOpCarry {
pub right: Box<MediumLevelILLiftedInstruction>,
pub carry: Box<MediumLevelILLiftedInstruction>,
}
-impl BinaryOpCarry {
- pub(crate) fn new(left: usize, right: usize, carry: usize) -> Self {
- Self { left, right, carry }
- }
-}
// CALL, TAILCALL
#[derive(Copy, Clone)]
@@ -784,23 +572,6 @@ pub struct LiftedCall {
pub dest: Box<MediumLevelILLiftedInstruction>,
pub params: Vec<MediumLevelILLiftedInstruction>,
}
-impl Call {
- pub(crate) fn new(
- num_outputs: usize,
- first_output: usize,
- dest: usize,
- num_params: usize,
- first_param: usize,
- ) -> Self {
- Self {
- num_outputs,
- first_output,
- dest,
- num_params,
- first_param,
- }
- }
-}
// SYSCALL
#[derive(Copy, Clone)]
@@ -815,21 +586,6 @@ pub struct LiftedSyscallCall {
pub output: Vec<Variable>,
pub params: Vec<MediumLevelILLiftedInstruction>,
}
-impl Syscall {
- pub(crate) fn new(
- num_outputs: usize,
- first_output: usize,
- num_params: usize,
- first_param: usize,
- ) -> Self {
- Self {
- num_outputs,
- first_output,
- num_params,
- first_param,
- }
- }
-}
// INTRINSIC
#[derive(Copy, Clone)]
@@ -846,23 +602,6 @@ pub struct LiftedIntrinsic {
pub intrinsic: ILIntrinsic,
pub params: Vec<MediumLevelILLiftedInstruction>,
}
-impl Intrinsic {
- pub(crate) fn new(
- num_outputs: usize,
- first_output: usize,
- intrinsic: u32,
- num_params: usize,
- first_param: usize,
- ) -> Self {
- Self {
- num_outputs,
- first_output,
- intrinsic,
- num_params,
- first_param,
- }
- }
-}
// INTRINSIC_SSA
#[derive(Copy, Clone)]
@@ -879,23 +618,6 @@ pub struct LiftedIntrinsicSsa {
pub intrinsic: ILIntrinsic,
pub params: Vec<MediumLevelILLiftedInstruction>,
}
-impl IntrinsicSsa {
- pub(crate) fn new(
- num_outputs: usize,
- first_output: usize,
- intrinsic: u32,
- num_params: usize,
- first_param: usize,
- ) -> Self {
- Self {
- num_outputs,
- first_output,
- intrinsic,
- num_params,
- first_param,
- }
- }
-}
// CALL_SSA, TAILCALL_SSA
#[derive(Copy, Clone)]
@@ -913,23 +635,6 @@ pub struct LiftedCallSsa {
pub params: Vec<MediumLevelILLiftedInstruction>,
pub src_memory: u64,
}
-impl CallSsa {
- pub(crate) fn new(
- output: usize,
- dest: usize,
- num_params: usize,
- first_param: usize,
- src_memory: u64,
- ) -> Self {
- Self {
- output,
- dest,
- first_param,
- num_params,
- src_memory,
- }
- }
-}
// CALL_UNTYPED_SSA, TAILCALL_UNTYPED_SSA
#[derive(Copy, Clone)]
@@ -946,16 +651,6 @@ pub struct LiftedCallUntypedSsa {
pub params: Vec<MediumLevelILLiftedInstruction>,
pub stack: Box<MediumLevelILLiftedInstruction>,
}
-impl CallUntypedSsa {
- pub(crate) fn new(output: usize, dest: usize, params: usize, stack: usize) -> Self {
- Self {
- output,
- dest,
- params,
- stack,
- }
- }
-}
// SYSCALL_SSA
#[derive(Copy, Clone)]
@@ -971,21 +666,6 @@ pub struct LiftedSyscallSsa {
pub params: Vec<MediumLevelILLiftedInstruction>,
pub src_memory: u64,
}
-impl SyscallSsa {
- pub(crate) fn new(
- output: usize,
- num_params: usize,
- first_param: usize,
- src_memory: u64,
- ) -> Self {
- Self {
- output,
- first_param,
- num_params,
- src_memory,
- }
- }
-}
// SYSCALL_UNTYPED_SSA
#[derive(Copy, Clone)]
@@ -1000,15 +680,6 @@ pub struct LiftedSyscallUntypedSsa {
pub params: Vec<MediumLevelILLiftedInstruction>,
pub stack: Box<MediumLevelILLiftedInstruction>,
}
-impl SyscallUntypedSsa {
- pub(crate) fn new(output: usize, params: usize, stack: usize) -> Self {
- Self {
- output,
- params,
- stack,
- }
- }
-}
// CALL_UNTYPED, TAILCALL_UNTYPED
#[derive(Copy, Clone)]
@@ -1025,16 +696,6 @@ pub struct LiftedCallUntyped {
pub params: Vec<MediumLevelILLiftedInstruction>,
pub stack: Box<MediumLevelILLiftedInstruction>,
}
-impl CallUntyped {
- pub(crate) fn new(output: usize, dest: usize, params: usize, stack: usize) -> Self {
- Self {
- output,
- dest,
- params,
- stack,
- }
- }
-}
// SYSCALL_UNTYPED
#[derive(Copy, Clone)]
@@ -1049,15 +710,6 @@ pub struct LiftedSyscallUntyped {
pub params: Vec<MediumLevelILLiftedInstruction>,
pub stack: Box<MediumLevelILLiftedInstruction>,
}
-impl SyscallUntyped {
- pub(crate) fn new(output: usize, params: usize, stack: usize) -> Self {
- Self {
- output,
- params,
- stack,
- }
- }
-}
// NEG, NOT, SX, ZX, LOW_PART, BOOL_TO_INT, UNIMPL_MEM, FSQRT, FNEG, FABS, FLOAT_TO_INT, INT_TO_FLOAT, FLOAT_CONV, ROUND_TO_INT, FLOOR, CEIL, FTRUNC, LOAD
#[derive(Copy, Clone)]
@@ -1068,11 +720,6 @@ pub struct UnaryOp {
pub struct LiftedUnaryOp {
pub src: Box<MediumLevelILLiftedInstruction>,
}
-impl UnaryOp {
- pub(crate) fn new(src: usize) -> Self {
- Self { src }
- }
-}
// LOAD_STRUCT
#[derive(Copy, Clone)]
@@ -1085,11 +732,6 @@ pub struct LiftedLoadStruct {
pub src: Box<MediumLevelILLiftedInstruction>,
pub offset: u64,
}
-impl LoadStruct {
- pub(crate) fn new(src: usize, offset: u64) -> Self {
- Self { src, offset }
- }
-}
// LOAD_STRUCT_SSA
#[derive(Copy, Clone)]
@@ -1104,15 +746,6 @@ pub struct LiftedLoadStructSsa {
pub offset: u64,
pub src_memory: u64,
}
-impl LoadStructSsa {
- pub(crate) fn new(src: usize, offset: u64, src_memory: u64) -> Self {
- Self {
- src,
- offset,
- src_memory,
- }
- }
-}
// LOAD_SSA
#[derive(Copy, Clone)]
@@ -1125,11 +758,6 @@ pub struct LiftedLoadSsa {
pub src: Box<MediumLevelILLiftedInstruction>,
pub src_memory: u64,
}
-impl LoadSsa {
- pub(crate) fn new(src: usize, src_memory: u64) -> Self {
- Self { src, src_memory }
- }
-}
// RET
#[derive(Copy, Clone)]
@@ -1141,14 +769,6 @@ pub struct Ret {
pub struct LiftedRet {
pub src: Vec<MediumLevelILLiftedInstruction>,
}
-impl Ret {
- pub(crate) fn new(num_operands: usize, first_operand: usize) -> Self {
- Self {
- first_operand,
- num_operands,
- }
- }
-}
// SEPARATE_PARAM_LIST
#[derive(Copy, Clone)]
@@ -1160,14 +780,6 @@ pub struct SeparateParamList {
pub struct LiftedSeparateParamList {
pub params: Vec<MediumLevelILLiftedInstruction>,
}
-impl SeparateParamList {
- pub fn new(num_params: usize, first_param: usize) -> Self {
- Self {
- num_params,
- first_param,
- }
- }
-}
// SHARED_PARAM_SLOT
#[derive(Copy, Clone)]
@@ -1179,25 +791,12 @@ pub struct SharedParamSlot {
pub struct LiftedSharedParamSlot {
pub params: Vec<MediumLevelILLiftedInstruction>,
}
-impl SharedParamSlot {
- pub fn new(num_params: usize, first_param: usize) -> Self {
- Self {
- num_params,
- first_param,
- }
- }
-}
// VAR, ADDRESS_OF
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
pub struct Var {
pub src: Variable,
}
-impl Var {
- pub(crate) fn new(src: u64) -> Self {
- Self { src: get_var(src) }
- }
-}
// VAR_FIELD, ADDRESS_OF_FIELD
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
@@ -1205,27 +804,12 @@ pub struct Field {
pub src: Variable,
pub offset: u64,
}
-impl Field {
- pub(crate) fn new(src: u64, offset: u64) -> Self {
- Self {
- src: get_var(src),
- offset,
- }
- }
-}
// VAR_SSA, VAR_ALIASED
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
pub struct VarSsa {
pub src: SSAVariable,
}
-impl VarSsa {
- pub(crate) fn new(src: (u64, usize)) -> Self {
- Self {
- src: get_var_ssa(src.0, src.1),
- }
- }
-}
// VAR_SSA_FIELD, VAR_ALIASED_FIELD
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
@@ -1233,22 +817,9 @@ pub struct VarSsaField {
pub src: SSAVariable,
pub offset: u64,
}
-impl VarSsaField {
- pub(crate) fn new(src: (u64, usize), offset: u64) -> Self {
- Self {
- src: get_var_ssa(src.0, src.1),
- offset,
- }
- }
-}
// TRAP
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
pub struct Trap {
pub vector: u64,
}
-impl Trap {
- pub(crate) fn new(vector: u64) -> Self {
- Self { vector }
- }
-}