diff options
Diffstat (limited to 'rust/src/medium_level_il/operation.rs')
| -rw-r--r-- | rust/src/medium_level_il/operation.rs | 581 |
1 files changed, 581 insertions, 0 deletions
diff --git a/rust/src/medium_level_il/operation.rs b/rust/src/medium_level_il/operation.rs new file mode 100644 index 00000000..e11f59c8 --- /dev/null +++ b/rust/src/medium_level_il/operation.rs @@ -0,0 +1,581 @@ +use super::{MediumLevelILLiftedInstruction, MediumLevelInstructionIndex}; +use crate::architecture::CoreIntrinsic; +use crate::variable::{ConstantData, SSAVariable, Variable}; +use std::collections::BTreeMap; + +// IF +#[derive(Debug, Copy, Clone)] +pub struct MediumLevelILOperationIf { + pub condition: usize, + pub dest_true: MediumLevelInstructionIndex, + pub dest_false: MediumLevelInstructionIndex, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedIf { + pub condition: Box<MediumLevelILLiftedInstruction>, + pub dest_true: MediumLevelInstructionIndex, + pub dest_false: MediumLevelInstructionIndex, +} + +// FLOAT_CONST +#[derive(Copy, Clone, Debug, PartialEq)] +pub struct FloatConst { + pub constant: f64, +} + +// CONST, CONST_PTR, IMPORT +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +pub struct Constant { + pub constant: u64, +} + +// EXTERN_PTR +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +pub struct ExternPtr { + pub constant: u64, + pub offset: u64, +} + +// CONST_DATA +#[derive(Debug, Copy, Clone)] +pub struct ConstData { + pub constant_data_kind: u32, + pub constant_data_value: i64, + pub size: usize, +} +#[derive(Clone, Debug, Hash, PartialEq)] +pub struct LiftedConstData { + pub constant_data: ConstantData, +} + +// JUMP, RET_HINT +#[derive(Debug, Copy, Clone)] +pub struct Jump { + pub dest: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedJump { + pub dest: Box<MediumLevelILLiftedInstruction>, +} + +// STORE_SSA +#[derive(Debug, Copy, Clone)] +pub struct StoreSsa { + pub dest: usize, + pub dest_memory: u64, + pub src_memory: u64, + pub src: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedStoreSsa { + pub dest: Box<MediumLevelILLiftedInstruction>, + pub dest_memory: u64, + pub src_memory: u64, + pub src: Box<MediumLevelILLiftedInstruction>, +} + +// STORE_STRUCT_SSA +#[derive(Debug, Copy, Clone)] +pub struct StoreStructSsa { + pub dest: usize, + pub offset: u64, + pub dest_memory: u64, + pub src_memory: u64, + pub src: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedStoreStructSsa { + pub dest: Box<MediumLevelILLiftedInstruction>, + pub offset: u64, + pub dest_memory: u64, + pub src_memory: u64, + pub src: Box<MediumLevelILLiftedInstruction>, +} + +// STORE_STRUCT +#[derive(Debug, Copy, Clone)] +pub struct StoreStruct { + pub dest: usize, + pub offset: u64, + pub src: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedStoreStruct { + pub dest: Box<MediumLevelILLiftedInstruction>, + pub offset: u64, + pub src: Box<MediumLevelILLiftedInstruction>, +} + +// STORE +#[derive(Debug, Copy, Clone)] +pub struct Store { + pub dest: usize, + pub src: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedStore { + pub dest: Box<MediumLevelILLiftedInstruction>, + pub src: Box<MediumLevelILLiftedInstruction>, +} + +// JUMP_TO +#[derive(Debug, Copy, Clone)] +pub struct JumpTo { + pub dest: usize, + pub first_operand: usize, + pub num_operands: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedJumpTo { + pub dest: Box<MediumLevelILLiftedInstruction>, + pub targets: BTreeMap<u64, MediumLevelInstructionIndex>, +} + +// GOTO +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +pub struct Goto { + pub dest: MediumLevelInstructionIndex, +} + +// FREE_VAR_SLOT +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +pub struct FreeVarSlot { + pub dest: Variable, +} + +// SET_VAR_FIELD +#[derive(Debug, Copy, Clone)] +pub struct SetVarField { + pub dest: Variable, + pub offset: u64, + pub src: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedSetVarField { + pub dest: Variable, + pub offset: u64, + pub src: Box<MediumLevelILLiftedInstruction>, +} + +// SET_VAR +#[derive(Debug, Copy, Clone)] +pub struct SetVar { + pub dest: Variable, + // TODO: Expression? + pub src: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedSetVar { + pub dest: Variable, + pub src: Box<MediumLevelILLiftedInstruction>, +} + +// FREE_VAR_SLOT_SSA +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +pub struct FreeVarSlotSsa { + pub dest: SSAVariable, + pub prev: SSAVariable, +} + +// SET_VAR_SSA_FIELD, SET_VAR_ALIASED_FIELD +#[derive(Debug, Copy, Clone)] +pub struct SetVarSsaField { + pub dest: SSAVariable, + pub prev: SSAVariable, + pub offset: u64, + pub src: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedSetVarSsaField { + pub dest: SSAVariable, + pub prev: SSAVariable, + pub offset: u64, + pub src: Box<MediumLevelILLiftedInstruction>, +} + +// SET_VAR_ALIASED +#[derive(Debug, Copy, Clone)] +pub struct SetVarAliased { + pub dest: SSAVariable, + pub prev: SSAVariable, + pub src: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedSetVarAliased { + pub dest: SSAVariable, + pub prev: SSAVariable, + pub src: Box<MediumLevelILLiftedInstruction>, +} + +// SET_VAR_SSA +#[derive(Debug, Copy, Clone)] +pub struct SetVarSsa { + pub dest: SSAVariable, + pub src: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedSetVarSsa { + pub dest: SSAVariable, + pub src: Box<MediumLevelILLiftedInstruction>, +} + +// VAR_PHI +#[derive(Debug, Copy, Clone)] +pub struct VarPhi { + pub dest: SSAVariable, + pub first_operand: usize, + pub num_operands: usize, +} +#[derive(Clone, Debug, Hash, PartialEq, Eq)] +pub struct LiftedVarPhi { + pub dest: SSAVariable, + pub src: Vec<SSAVariable>, +} + +// MEM_PHI +#[derive(Debug, Copy, Clone)] +pub struct MemPhi { + pub dest_memory: u64, + pub first_operand: usize, + pub num_operands: usize, +} +#[derive(Clone, Debug, Hash, PartialEq, Eq)] +pub struct LiftedMemPhi { + pub dest_memory: u64, + pub src_memory: Vec<u64>, +} + +// VAR_SPLIT +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +pub struct VarSplit { + pub high: Variable, + pub low: Variable, +} + +// SET_VAR_SPLIT +#[derive(Debug, Copy, Clone)] +pub struct SetVarSplit { + pub high: Variable, + pub low: Variable, + pub src: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedSetVarSplit { + pub high: Variable, + pub low: Variable, + pub src: Box<MediumLevelILLiftedInstruction>, +} + +// VAR_SPLIT_SSA +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +pub struct VarSplitSsa { + pub high: SSAVariable, + pub low: SSAVariable, +} + +// SET_VAR_SPLIT_SSA +#[derive(Debug, Copy, Clone)] +pub struct SetVarSplitSsa { + pub high: SSAVariable, + pub low: SSAVariable, + pub src: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedSetVarSplitSsa { + pub high: SSAVariable, + pub low: SSAVariable, + pub src: Box<MediumLevelILLiftedInstruction>, +} + +// 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(Debug, Copy, Clone)] +pub struct BinaryOp { + pub left: usize, + pub right: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedBinaryOp { + pub left: Box<MediumLevelILLiftedInstruction>, + pub right: Box<MediumLevelILLiftedInstruction>, +} + +// ADC, SBB, RLC, RRC +#[derive(Debug, Copy, Clone)] +pub struct BinaryOpCarry { + pub left: usize, + pub right: usize, + pub carry: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedBinaryOpCarry { + pub left: Box<MediumLevelILLiftedInstruction>, + pub right: Box<MediumLevelILLiftedInstruction>, + pub carry: Box<MediumLevelILLiftedInstruction>, +} + +// CALL, TAILCALL +#[derive(Debug, Copy, Clone)] +pub struct Call { + pub first_output: usize, + pub num_outputs: usize, + pub dest: usize, + pub first_param: usize, + pub num_params: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedCall { + pub output: Vec<Variable>, + pub dest: Box<MediumLevelILLiftedInstruction>, + pub params: Vec<MediumLevelILLiftedInstruction>, +} + +// SYSCALL +#[derive(Debug, Copy, Clone)] +pub struct Syscall { + pub first_output: usize, + pub num_outputs: usize, + pub first_param: usize, + pub num_params: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedSyscallCall { + pub output: Vec<Variable>, + pub params: Vec<MediumLevelILLiftedInstruction>, +} + +// INTRINSIC +#[derive(Debug, Copy, Clone)] +pub struct Intrinsic { + pub first_output: usize, + pub num_outputs: usize, + pub intrinsic: u32, + pub first_param: usize, + pub num_params: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedIntrinsic { + pub output: Vec<Variable>, + pub intrinsic: CoreIntrinsic, + pub params: Vec<MediumLevelILLiftedInstruction>, +} + +// INTRINSIC_SSA +#[derive(Debug, Copy, Clone)] +pub struct IntrinsicSsa { + pub first_output: usize, + pub num_outputs: usize, + pub intrinsic: u32, + pub first_param: usize, + pub num_params: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedIntrinsicSsa { + pub output: Vec<SSAVariable>, + pub intrinsic: CoreIntrinsic, + pub params: Vec<MediumLevelILLiftedInstruction>, +} + +// CALL_SSA, TAILCALL_SSA +#[derive(Debug, Copy, Clone)] +pub struct CallSsa { + pub output: usize, + pub dest: usize, + pub first_param: usize, + pub num_params: usize, + pub src_memory: u64, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedCallSsa { + pub output: Vec<SSAVariable>, + pub dest: Box<MediumLevelILLiftedInstruction>, + pub params: Vec<MediumLevelILLiftedInstruction>, + pub src_memory: u64, +} + +// CALL_UNTYPED_SSA, TAILCALL_UNTYPED_SSA +#[derive(Debug, Copy, Clone)] +pub struct CallUntypedSsa { + pub output: usize, + pub dest: usize, + pub params: usize, + pub stack: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedCallUntypedSsa { + pub output: Vec<SSAVariable>, + pub dest: Box<MediumLevelILLiftedInstruction>, + pub params: Vec<MediumLevelILLiftedInstruction>, + pub stack: Box<MediumLevelILLiftedInstruction>, +} + +// SYSCALL_SSA +#[derive(Debug, Copy, Clone)] +pub struct SyscallSsa { + pub output: usize, + pub first_param: usize, + pub num_params: usize, + pub src_memory: u64, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedSyscallSsa { + pub output: Vec<SSAVariable>, + pub params: Vec<MediumLevelILLiftedInstruction>, + pub src_memory: u64, +} + +// SYSCALL_UNTYPED_SSA +#[derive(Debug, Copy, Clone)] +pub struct SyscallUntypedSsa { + pub output: usize, + pub params: usize, + pub stack: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedSyscallUntypedSsa { + pub output: Vec<SSAVariable>, + pub params: Vec<MediumLevelILLiftedInstruction>, + pub stack: Box<MediumLevelILLiftedInstruction>, +} + +// CALL_UNTYPED, TAILCALL_UNTYPED +#[derive(Debug, Copy, Clone)] +pub struct CallUntyped { + pub output: usize, + pub dest: usize, + pub params: usize, + pub stack: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedCallUntyped { + pub output: Vec<Variable>, + pub dest: Box<MediumLevelILLiftedInstruction>, + pub params: Vec<MediumLevelILLiftedInstruction>, + pub stack: Box<MediumLevelILLiftedInstruction>, +} + +// SYSCALL_UNTYPED +#[derive(Debug, Copy, Clone)] +pub struct SyscallUntyped { + pub output: usize, + pub params: usize, + pub stack: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedSyscallUntyped { + pub output: Vec<Variable>, + pub params: Vec<MediumLevelILLiftedInstruction>, + pub stack: Box<MediumLevelILLiftedInstruction>, +} + +// 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(Debug, Copy, Clone)] +pub struct UnaryOp { + pub src: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedUnaryOp { + pub src: Box<MediumLevelILLiftedInstruction>, +} + +// LOAD_STRUCT +#[derive(Debug, Copy, Clone)] +pub struct LoadStruct { + pub src: usize, + pub offset: u64, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedLoadStruct { + pub src: Box<MediumLevelILLiftedInstruction>, + pub offset: u64, +} + +// LOAD_STRUCT_SSA +#[derive(Debug, Copy, Clone)] +pub struct LoadStructSsa { + pub src: usize, + pub offset: u64, + pub src_memory: u64, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedLoadStructSsa { + pub src: Box<MediumLevelILLiftedInstruction>, + pub offset: u64, + pub src_memory: u64, +} + +// LOAD_SSA +#[derive(Debug, Copy, Clone)] +pub struct LoadSsa { + pub src: usize, + pub src_memory: u64, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedLoadSsa { + pub src: Box<MediumLevelILLiftedInstruction>, + pub src_memory: u64, +} + +// RET +#[derive(Debug, Copy, Clone)] +pub struct Ret { + pub first_operand: usize, + pub num_operands: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedRet { + pub src: Vec<MediumLevelILLiftedInstruction>, +} + +// SEPARATE_PARAM_LIST +#[derive(Debug, Copy, Clone)] +pub struct SeparateParamList { + pub first_param: usize, + pub num_params: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedSeparateParamList { + pub params: Vec<MediumLevelILLiftedInstruction>, +} + +// SHARED_PARAM_SLOT +#[derive(Debug, Copy, Clone)] +pub struct SharedParamSlot { + pub first_param: usize, + pub num_params: usize, +} +#[derive(Clone, Debug, PartialEq)] +pub struct LiftedSharedParamSlot { + pub params: Vec<MediumLevelILLiftedInstruction>, +} + +// VAR, ADDRESS_OF +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +pub struct Var { + pub src: Variable, +} + +// VAR_FIELD, ADDRESS_OF_FIELD +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +pub struct Field { + pub src: Variable, + pub offset: u64, +} + +// VAR_SSA, VAR_ALIASED +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +pub struct VarSsa { + pub src: SSAVariable, +} + +// VAR_SSA_FIELD, VAR_ALIASED_FIELD +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +pub struct VarSsaField { + pub src: SSAVariable, + pub offset: u64, +} + +// TRAP +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +pub struct Trap { + pub vector: u64, +} |
