diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2025-12-23 13:12:02 -0700 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2026-05-22 16:30:56 -0400 |
| commit | 8d621c51b2797fda7b1dc22243dde611cfc04f68 (patch) | |
| tree | ba5e6a90e644d21d13e75dabcbd0cc747444443a /rust/src/medium_level_il/instruction.rs | |
| parent | 08e34ac325743085911f96b62c81d9a1f2127806 (diff) | |
Refactor calling conventions to support correct representation of structures
Diffstat (limited to 'rust/src/medium_level_il/instruction.rs')
| -rw-r--r-- | rust/src/medium_level_il/instruction.rs | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/rust/src/medium_level_il/instruction.rs b/rust/src/medium_level_il/instruction.rs index a223f21e..41f2bbe4 100644 --- a/rust/src/medium_level_il/instruction.rs +++ b/rust/src/medium_level_il/instruction.rs @@ -654,9 +654,22 @@ impl MediumLevelILInstruction { MLIL_VAR_OUTPUT => Op::VarOutput(VarOutput { dest: get_var(op.operands[0]), }), + MLIL_VAR_OUTPUT_FIELD => Op::VarOutputField(VarOutputField { + dest: get_var(op.operands[0]), + offset: op.operands[1], + }), + MLIL_STORE_OUTPUT => Op::StoreOutput(StoreOutput { + dest: MediumLevelExpressionIndex::from(op.operands[0]), + }), MLIL_ADDRESS_OF => Op::AddressOf(Var { src: get_var(op.operands[0]), }), + MLIL_PASS_BY_REF => Op::PassByRef(UnaryOp { + src: MediumLevelExpressionIndex::from(op.operands[0] as usize), + }), + MLIL_RETURN_BY_REF => Op::ReturnByRef(UnaryOp { + src: MediumLevelExpressionIndex::from(op.operands[0] as usize), + }), MLIL_VAR_FIELD => Op::VarField(Field { src: get_var(op.operands[0]), offset: op.operands[1], @@ -682,9 +695,27 @@ impl MediumLevelILInstruction { MLIL_VAR_OUTPUT_SSA => Op::VarOutputSsa(VarOutputSsa { dest: get_var_ssa(op.operands[0], op.operands[1] as usize), }), + MLIL_VAR_OUTPUT_SSA_FIELD => Op::VarOutputSsaField(VarOutputSsaField { + dest: get_var_ssa(op.operands[0], op.operands[1] as usize), + prev: get_var_ssa(op.operands[0], op.operands[2] as usize), + offset: op.operands[3], + }), + MLIL_VAR_OUTPUT_ALIASED => Op::VarOutputAliased(VarOutputAliased { + dest: get_var_ssa(op.operands[0], op.operands[1] as usize), + prev: get_var_ssa(op.operands[0], op.operands[2] as usize), + }), + MLIL_VAR_OUTPUT_ALIASED_FIELD => Op::VarOutputAliasedField(VarOutputAliasedField { + dest: get_var_ssa(op.operands[0], op.operands[1] as usize), + prev: get_var_ssa(op.operands[0], op.operands[2] as usize), + offset: op.operands[3], + }), MLIL_TRAP => Op::Trap(Trap { vector: op.operands[0], }), + MLIL_BLOCK_TO_EXPAND => Op::BlockToExpand(BlockToExpand { + num_operands: op.operands[0] as usize, + first_operand: op.operands[1] as usize, + }), }; Self { @@ -1121,7 +1152,13 @@ impl MediumLevelILInstruction { }), Var(op) => Lifted::Var(op), VarOutput(op) => Lifted::VarOutput(op), + VarOutputField(op) => Lifted::VarOutputField(op), + StoreOutput(op) => Lifted::StoreOutput(LiftedStoreOutput { + dest: self.lift_operand(op.dest), + }), AddressOf(op) => Lifted::AddressOf(op), + PassByRef(op) => Lifted::PassByRef(self.lift_unary_op(op)), + ReturnByRef(op) => Lifted::ReturnByRef(self.lift_unary_op(op)), VarField(op) => Lifted::VarField(op), AddressOfField(op) => Lifted::AddressOfField(op), VarSsa(op) => Lifted::VarSsa(op), @@ -1129,7 +1166,17 @@ impl MediumLevelILInstruction { VarSsaField(op) => Lifted::VarSsaField(op), VarAliasedField(op) => Lifted::VarAliasedField(op), VarOutputSsa(op) => Lifted::VarOutputSsa(op), + VarOutputSsaField(op) => Lifted::VarOutputSsaField(op), + VarOutputAliased(op) => Lifted::VarOutputAliased(op), + VarOutputAliasedField(op) => Lifted::VarOutputAliasedField(op), Trap(op) => Lifted::Trap(op), + BlockToExpand(_op) => Lifted::BlockToExpand(LiftedBlockToExpand { + exprs: self + .get_expr_list(0) + .iter() + .map(|expr| expr.lift()) + .collect(), + }), }; MediumLevelILLiftedInstruction { @@ -1823,6 +1870,8 @@ pub enum MediumLevelILInstructionKind { SeparateParamList(SeparateParamList), SharedParamSlot(SharedParamSlot), VarOutput(VarOutput), + VarOutputField(VarOutputField), + StoreOutput(StoreOutput), Neg(UnaryOp), Not(UnaryOp), Sx(UnaryOp), @@ -1847,6 +1896,8 @@ pub enum MediumLevelILInstructionKind { Ret(Ret), Var(Var), AddressOf(Var), + PassByRef(UnaryOp), + ReturnByRef(UnaryOp), VarField(Field), AddressOfField(Field), VarSsa(VarSsa), @@ -1854,7 +1905,11 @@ pub enum MediumLevelILInstructionKind { VarSsaField(VarSsaField), VarAliasedField(VarSsaField), VarOutputSsa(VarOutputSsa), + VarOutputSsaField(VarOutputSsaField), + VarOutputAliased(VarOutputAliased), + VarOutputAliasedField(VarOutputAliasedField), Trap(Trap), + BlockToExpand(BlockToExpand), // A placeholder for instructions that the Rust bindings do not yet support. // Distinct from `Unimpl` as that is a valid instruction. NotYetImplemented, |
