diff options
| author | Michael Krasnitski <michael.krasnitski@gmail.com> | 2024-02-07 13:15:34 -0500 |
|---|---|---|
| committer | Kyle Martin <krm504@nyu.edu> | 2024-03-18 17:46:37 -0400 |
| commit | b6897fab3eddcb94ebae211913253246f0407377 (patch) | |
| tree | fd8bb3918a505b799a76ada02aa7e227ccdea760 /rust/src/mlil/operation.rs | |
| parent | 5fcf6bc59ebc2110d053360d223e6570cdd2272c (diff) | |
Instantiate `MediumLevelILInstruction` inline and remove constructors
Diffstat (limited to 'rust/src/mlil/operation.rs')
| -rw-r--r-- | rust/src/mlil/operation.rs | 437 |
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 } - } -} |
