use super::{ MediumLevelExpressionIndex, 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: MediumLevelExpressionIndex, pub dest_true: MediumLevelInstructionIndex, pub dest_false: MediumLevelInstructionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedIf { pub condition: Box, 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: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedJump { pub dest: Box, } // STORE_SSA #[derive(Debug, Copy, Clone)] pub struct StoreSsa { pub dest: MediumLevelExpressionIndex, pub dest_memory: u64, pub src_memory: u64, pub src: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedStoreSsa { pub dest: Box, pub dest_memory: u64, pub src_memory: u64, pub src: Box, } // STORE_STRUCT_SSA #[derive(Debug, Copy, Clone)] pub struct StoreStructSsa { pub dest: MediumLevelExpressionIndex, pub offset: u64, pub dest_memory: u64, pub src_memory: u64, pub src: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedStoreStructSsa { pub dest: Box, pub offset: u64, pub dest_memory: u64, pub src_memory: u64, pub src: Box, } // STORE_STRUCT #[derive(Debug, Copy, Clone)] pub struct StoreStruct { pub dest: MediumLevelExpressionIndex, pub offset: u64, pub src: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedStoreStruct { pub dest: Box, pub offset: u64, pub src: Box, } // STORE #[derive(Debug, Copy, Clone)] pub struct Store { pub dest: MediumLevelExpressionIndex, pub src: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedStore { pub dest: Box, pub src: Box, } // JUMP_TO #[derive(Debug, Copy, Clone)] pub struct JumpTo { pub dest: MediumLevelExpressionIndex, pub first_operand: usize, pub num_operands: usize, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedJumpTo { pub dest: Box, pub targets: BTreeMap, } // 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: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedSetVarField { pub dest: Variable, pub offset: u64, pub src: Box, } // SET_VAR #[derive(Debug, Copy, Clone)] pub struct SetVar { pub dest: Variable, pub src: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedSetVar { pub dest: Variable, pub src: Box, } // 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: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedSetVarSsaField { pub dest: SSAVariable, pub prev: SSAVariable, pub offset: u64, pub src: Box, } // SET_VAR_ALIASED #[derive(Debug, Copy, Clone)] pub struct SetVarAliased { pub dest: SSAVariable, pub prev: SSAVariable, pub src: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedSetVarAliased { pub dest: SSAVariable, pub prev: SSAVariable, pub src: Box, } // SET_VAR_SSA #[derive(Debug, Copy, Clone)] pub struct SetVarSsa { pub dest: SSAVariable, pub src: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedSetVarSsa { pub dest: SSAVariable, pub src: Box, } // 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, } // 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, } // 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: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedSetVarSplit { pub high: Variable, pub low: Variable, pub src: Box, } // 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: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedSetVarSplitSsa { pub high: SSAVariable, pub low: SSAVariable, pub src: Box, } // 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: MediumLevelExpressionIndex, pub right: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedBinaryOp { pub left: Box, pub right: Box, } // ADC, SBB, RLC, RRC #[derive(Debug, Copy, Clone)] pub struct BinaryOpCarry { pub left: MediumLevelExpressionIndex, pub right: MediumLevelExpressionIndex, pub carry: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedBinaryOpCarry { pub left: Box, pub right: Box, pub carry: Box, } // CALL, TAILCALL #[derive(Debug, Copy, Clone)] pub struct Call { pub first_output: usize, pub num_outputs: usize, pub dest: MediumLevelExpressionIndex, pub first_param: usize, pub num_params: usize, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedCall { pub output: Vec, pub dest: Box, pub params: Vec, } // CALL_OUTPUT #[derive(Debug, Copy, Clone)] pub struct CallOutput { pub first_output: usize, pub num_outputs: usize, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedCallOutput { pub output: Vec, } // CALL_PARAM_SSA #[derive(Debug, Copy, Clone)] pub struct CallParam { pub first_param: usize, pub num_params: usize, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedCallParam { pub params: Vec, } // CALL_OUTPUT_SSA #[derive(Debug, Copy, Clone)] pub struct CallOutputSsa { pub dest_memory: u64, pub first_output: usize, pub num_outputs: usize, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedCallOutputSsa { pub dest_memory: u64, pub output: Vec, } // CALL_PARAM_SSA #[derive(Debug, Copy, Clone)] pub struct CallParamSsa { pub src_memory: u64, pub first_param: usize, pub num_params: usize, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedCallParamSsa { pub src_memory: u64, pub params: Vec, } // 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, pub params: Vec, } // 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, pub intrinsic: CoreIntrinsic, pub params: Vec, } // 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, pub intrinsic: CoreIntrinsic, pub params: Vec, } // MEMORY_INTRINSIC_SSA #[derive(Debug, Copy, Clone)] pub struct MemoryIntrinsicSsa { pub output: MediumLevelExpressionIndex, pub intrinsic: u32, pub first_param: usize, pub num_params: usize, pub src_memory: u64, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedMemoryIntrinsicSsa { pub output: Box, pub intrinsic: CoreIntrinsic, pub params: Vec, pub src_memory: u64, } // MEMORY_INTRINSIC_OUTPUT_SSA #[derive(Debug, Copy, Clone)] pub struct MemoryIntrinsicOutputSsa { pub dest_memory: u64, pub first_output: usize, pub num_outputs: usize, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedMemoryIntrinsicOutputSsa { pub dest_memory: u64, pub output: Vec, } // CALL_SSA, TAILCALL_SSA #[derive(Debug, Copy, Clone)] pub struct CallSsa { pub output: MediumLevelExpressionIndex, pub dest: MediumLevelExpressionIndex, pub first_param: usize, pub num_params: usize, pub src_memory: u64, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedCallSsa { pub output: Vec, pub dest: Box, pub params: Vec, pub src_memory: u64, } // CALL_UNTYPED_SSA, TAILCALL_UNTYPED_SSA #[derive(Debug, Copy, Clone)] pub struct CallUntypedSsa { pub output: MediumLevelExpressionIndex, pub dest: MediumLevelExpressionIndex, pub params: MediumLevelExpressionIndex, pub stack: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedCallUntypedSsa { pub output: Vec, pub dest: Box, pub params: Vec, pub stack: Box, } // SYSCALL_SSA #[derive(Debug, Copy, Clone)] pub struct SyscallSsa { pub output: MediumLevelExpressionIndex, pub first_param: usize, pub num_params: usize, pub src_memory: u64, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedSyscallSsa { pub output: Vec, pub params: Vec, pub src_memory: u64, } // SYSCALL_UNTYPED_SSA #[derive(Debug, Copy, Clone)] pub struct SyscallUntypedSsa { pub output: MediumLevelExpressionIndex, pub params: MediumLevelExpressionIndex, pub stack: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedSyscallUntypedSsa { pub output: Vec, pub params: Vec, pub stack: Box, } // CALL_UNTYPED, TAILCALL_UNTYPED #[derive(Debug, Copy, Clone)] pub struct CallUntyped { pub first_output: usize, pub num_outputs: usize, pub dest: MediumLevelExpressionIndex, pub params: MediumLevelExpressionIndex, pub stack: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedCallUntyped { pub output: Vec, pub dest: Box, pub params: Vec, pub stack: Box, } // SYSCALL_UNTYPED #[derive(Debug, Copy, Clone)] pub struct SyscallUntyped { pub first_output: usize, pub num_outputs: usize, pub params: MediumLevelExpressionIndex, pub stack: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedSyscallUntyped { pub output: Vec, pub params: Vec, pub stack: Box, } // 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: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedUnaryOp { pub src: Box, } // LOAD_STRUCT #[derive(Debug, Copy, Clone)] pub struct LoadStruct { pub src: MediumLevelExpressionIndex, pub offset: u64, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedLoadStruct { pub src: Box, pub offset: u64, } // LOAD_STRUCT_SSA #[derive(Debug, Copy, Clone)] pub struct LoadStructSsa { pub src: MediumLevelExpressionIndex, pub offset: u64, pub src_memory: u64, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedLoadStructSsa { pub src: Box, pub offset: u64, pub src_memory: u64, } // LOAD_SSA #[derive(Debug, Copy, Clone)] pub struct LoadSsa { pub src: MediumLevelExpressionIndex, pub src_memory: u64, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedLoadSsa { pub src: Box, 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, } // 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, } // 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, } // VAR, ADDRESS_OF #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] pub struct Var { pub src: Variable, } // VAR_OUTPUT #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] pub struct VarOutput { pub dest: Variable, } // VAR_OUTPUT_FIELD #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct VarOutputField { pub dest: Variable, pub offset: u64, } // STORE_OUTPUT #[derive(Debug, Copy, Clone)] pub struct StoreOutput { pub dest: MediumLevelExpressionIndex, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedStoreOutput { pub dest: Box, } // 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, } // VAR_OUTPUT_SSA #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] pub struct VarOutputSsa { pub dest: SSAVariable, } // VAR_OUTPUT_SSA_FIELD #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct VarOutputSsaField { pub dest: SSAVariable, pub prev: SSAVariable, pub offset: u64, } // VAR_OUTPUT_ALIASED #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct VarOutputAliased { pub dest: SSAVariable, pub prev: SSAVariable, } // VAR_OUTPUT_ALIASED_FIELD #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct VarOutputAliasedField { pub dest: SSAVariable, pub prev: SSAVariable, pub offset: u64, } // TRAP #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] pub struct Trap { pub vector: u64, } // BLOCK_TO_EXPAND #[derive(Debug, Copy, Clone)] pub struct BlockToExpand { pub first_operand: usize, pub num_operands: usize, } #[derive(Clone, Debug, PartialEq)] pub struct LiftedBlockToExpand { pub exprs: Vec, }