From 41497526378568c17c4340f6a523a696920c2d1a Mon Sep 17 00:00:00 2001 From: Mark Rowe Date: Tue, 18 Nov 2025 12:31:16 -0800 Subject: Allow overriding the IL source location that is used by *ILInstruction::CopyTo --- mediumlevelilinstruction.cpp | 152 ++++++++++++++++++++++--------------------- 1 file changed, 78 insertions(+), 74 deletions(-) (limited to 'mediumlevelilinstruction.cpp') diff --git a/mediumlevelilinstruction.cpp b/mediumlevelilinstruction.cpp index 1894294b..1cbabb5e 100644 --- a/mediumlevelilinstruction.cpp +++ b/mediumlevelilinstruction.cpp @@ -1578,145 +1578,149 @@ void MediumLevelILInstruction::VisitExprs(const std::function& subExprHandler) const + const std::function& subExprHandler, + const ILSourceLocation& sourceLocation) const { vector params; BNMediumLevelILLabel* labelA; BNMediumLevelILLabel* labelB; + + const auto& loc = sourceLocation.valid ? sourceLocation : ILSourceLocation{*this}; + switch (operation) { case MLIL_NOP: - return dest->Nop(*this); + return dest->Nop(loc); case MLIL_SET_VAR: return dest->SetVar( - size, GetDestVariable(), subExprHandler(GetSourceExpr()), *this); + size, GetDestVariable(), subExprHandler(GetSourceExpr()), loc); case MLIL_SET_VAR_SSA: return dest->SetVarSSA( - size, GetDestSSAVariable(), subExprHandler(GetSourceExpr()), *this); + size, GetDestSSAVariable(), subExprHandler(GetSourceExpr()), loc); case MLIL_SET_VAR_ALIASED: return dest->SetVarAliased(size, GetDestSSAVariable().var, GetDestSSAVariable().version, GetSourceSSAVariable().version, - subExprHandler(GetSourceExpr()), *this); + subExprHandler(GetSourceExpr()), loc); case MLIL_SET_VAR_SPLIT: return dest->SetVarSplit(size, GetHighVariable(), GetLowVariable(), - subExprHandler(GetSourceExpr()), *this); + subExprHandler(GetSourceExpr()), loc); case MLIL_SET_VAR_SPLIT_SSA: return dest->SetVarSSASplit(size, GetHighSSAVariable(), GetLowSSAVariable(), subExprHandler(GetSourceExpr()), - *this); + loc); case MLIL_SET_VAR_FIELD: return dest->SetVarField(size, GetDestVariable(), GetOffset(), - subExprHandler(GetSourceExpr()), *this); + subExprHandler(GetSourceExpr()), loc); case MLIL_SET_VAR_SSA_FIELD: return dest->SetVarSSAField(size, GetDestSSAVariable().var, GetDestSSAVariable().version, GetSourceSSAVariable().version, GetOffset(), - subExprHandler(GetSourceExpr()), *this); + subExprHandler(GetSourceExpr()), loc); case MLIL_SET_VAR_ALIASED_FIELD: return dest->SetVarAliasedField(size, GetDestSSAVariable().var, GetDestSSAVariable().version, GetSourceSSAVariable().version, GetOffset(), - subExprHandler(GetSourceExpr()), *this); + subExprHandler(GetSourceExpr()), loc); case MLIL_VAR: - return dest->Var(size, GetSourceVariable(), *this); + return dest->Var(size, GetSourceVariable(), loc); case MLIL_VAR_FIELD: - return dest->VarField(size, GetSourceVariable(), GetOffset(), *this); + return dest->VarField(size, GetSourceVariable(), GetOffset(), loc); case MLIL_VAR_SPLIT: - return dest->VarSplit(size, GetHighVariable(), GetLowVariable(), *this); + return dest->VarSplit(size, GetHighVariable(), GetLowVariable(), loc); case MLIL_VAR_SSA: - return dest->VarSSA(size, GetSourceSSAVariable(), *this); + return dest->VarSSA(size, GetSourceSSAVariable(), loc); case MLIL_VAR_SSA_FIELD: return dest->VarSSAField( - size, GetSourceSSAVariable(), GetOffset(), *this); + size, GetSourceSSAVariable(), GetOffset(), loc); case MLIL_VAR_ALIASED: return dest->VarAliased(size, GetSourceSSAVariable().var, - GetSourceSSAVariable().version, *this); + GetSourceSSAVariable().version, loc); case MLIL_VAR_ALIASED_FIELD: return dest->VarAliasedField(size, GetSourceSSAVariable().var, - GetSourceSSAVariable().version, GetOffset(), *this); + GetSourceSSAVariable().version, GetOffset(), loc); case MLIL_VAR_SPLIT_SSA: return dest->VarSplitSSA( - size, GetHighSSAVariable(), GetLowSSAVariable(), *this); + size, GetHighSSAVariable(), GetLowSSAVariable(), loc); case MLIL_FORCE_VER: - return dest->ForceVer(size, GetDestVariable(), GetSourceVariable(), *this); + return dest->ForceVer(size, GetDestVariable(), GetSourceVariable(), loc); case MLIL_FORCE_VER_SSA: - return dest->ForceVerSSA(size, GetDestSSAVariable(), GetSourceSSAVariable(), *this); + return dest->ForceVerSSA(size, GetDestSSAVariable(), GetSourceSSAVariable(), loc); case MLIL_ASSERT: - return dest->Assert(size, GetSourceVariable(), GetConstraint(), *this); + return dest->Assert(size, GetSourceVariable(), GetConstraint(), loc); case MLIL_ASSERT_SSA: - return dest->AssertSSA(size, GetSourceSSAVariable(), GetConstraint(), *this); + return dest->AssertSSA(size, GetSourceSSAVariable(), GetConstraint(), loc); case MLIL_ADDRESS_OF: - return dest->AddressOf(GetSourceVariable(), *this); + return dest->AddressOf(GetSourceVariable(), loc); case MLIL_ADDRESS_OF_FIELD: return dest->AddressOfField( - GetSourceVariable(), GetOffset(), *this); + GetSourceVariable(), GetOffset(), loc); case MLIL_CALL: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); - return dest->Call(GetOutputVariables(), subExprHandler(GetDestExpr()), params, *this); + return dest->Call(GetOutputVariables(), subExprHandler(GetDestExpr()), params, loc); case MLIL_CALL_UNTYPED: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->CallUntyped(GetOutputVariables(), subExprHandler(GetDestExpr()), params, - subExprHandler(GetStackExpr()), *this); + subExprHandler(GetStackExpr()), loc); case MLIL_CALL_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->CallSSA(GetOutputSSAVariables(), subExprHandler(GetDestExpr()), - params, GetDestMemoryVersion(), GetSourceMemoryVersion(), *this); + params, GetDestMemoryVersion(), GetSourceMemoryVersion(), loc); case MLIL_CALL_UNTYPED_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->CallUntypedSSA(GetOutputSSAVariables(), subExprHandler(GetDestExpr()), params, GetDestMemoryVersion(), GetSourceMemoryVersion(), - subExprHandler(GetStackExpr()), *this); + subExprHandler(GetStackExpr()), loc); case MLIL_SYSCALL: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); - return dest->Syscall(GetOutputVariables(), params, *this); + return dest->Syscall(GetOutputVariables(), params, loc); case MLIL_SYSCALL_UNTYPED: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->SyscallUntyped(GetOutputVariables(), - params, subExprHandler(GetStackExpr()), *this); + params, subExprHandler(GetStackExpr()), loc); case MLIL_SYSCALL_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->SyscallSSA(GetOutputSSAVariables(), params, - GetDestMemoryVersion(), GetSourceMemoryVersion(), *this); + GetDestMemoryVersion(), GetSourceMemoryVersion(), loc); case MLIL_SYSCALL_UNTYPED_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->SyscallUntypedSSA(GetOutputSSAVariables(), params, GetDestMemoryVersion(), GetSourceMemoryVersion(), - subExprHandler(GetStackExpr()), *this); + subExprHandler(GetStackExpr()), loc); case MLIL_TAILCALL: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->TailCall( - GetOutputVariables(), subExprHandler(GetDestExpr()), params, *this); + GetOutputVariables(), subExprHandler(GetDestExpr()), params, loc); case MLIL_TAILCALL_UNTYPED: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->TailCallUntyped(GetOutputVariables(), subExprHandler(GetDestExpr()), params, - subExprHandler(GetStackExpr()), *this); + subExprHandler(GetStackExpr()), loc); case MLIL_TAILCALL_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->TailCallSSA(GetOutputSSAVariables(), subExprHandler(GetDestExpr()), params, GetDestMemoryVersion(), - GetSourceMemoryVersion(), *this); + GetSourceMemoryVersion(), loc); case MLIL_TAILCALL_UNTYPED_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); @@ -1724,47 +1728,47 @@ ExprId MediumLevelILInstruction::CopyTo(MediumLevelILFunction* dest, subExprHandler(GetDestExpr()), params, GetDestMemoryVersion(), GetSourceMemoryVersion(), - subExprHandler(GetStackExpr()), *this); + subExprHandler(GetStackExpr()), loc); case MLIL_SEPARATE_PARAM_LIST: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); - return dest->SeparateParamList(params, *this); + return dest->SeparateParamList(params, loc); case MLIL_SHARED_PARAM_SLOT: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); - return dest->SharedParamSlot(params, *this); + return dest->SharedParamSlot(params, loc); case MLIL_RET: for (auto i : GetSourceExprs()) params.push_back(subExprHandler(i)); - return dest->Return(params, *this); + return dest->Return(params, loc); case MLIL_NORET: - return dest->NoReturn(*this); + return dest->NoReturn(loc); case MLIL_STORE: return dest->Store( - size, subExprHandler(GetDestExpr()), subExprHandler(GetSourceExpr()), *this); + size, subExprHandler(GetDestExpr()), subExprHandler(GetSourceExpr()), loc); case MLIL_STORE_STRUCT: return dest->StoreStruct(size, subExprHandler(GetDestExpr()), GetOffset(), - subExprHandler(GetSourceExpr()), *this); + subExprHandler(GetSourceExpr()), loc); case MLIL_STORE_SSA: return dest->StoreSSA(size, subExprHandler(GetDestExpr()), GetDestMemoryVersion(), GetSourceMemoryVersion(), - subExprHandler(GetSourceExpr()), *this); + subExprHandler(GetSourceExpr()), loc); case MLIL_STORE_STRUCT_SSA: return dest->StoreStructSSA(size, subExprHandler(GetDestExpr()), GetOffset(), GetDestMemoryVersion(), GetSourceMemoryVersion(), subExprHandler(GetSourceExpr()), - *this); + loc); case MLIL_LOAD: - return dest->Load(size, subExprHandler(GetSourceExpr()), *this); + return dest->Load(size, subExprHandler(GetSourceExpr()), loc); case MLIL_LOAD_STRUCT: return dest->LoadStruct( - size, subExprHandler(GetSourceExpr()), GetOffset(), *this); + size, subExprHandler(GetSourceExpr()), GetOffset(), loc); case MLIL_LOAD_SSA: return dest->LoadSSA( - size, subExprHandler(GetSourceExpr()), GetSourceMemoryVersion(), *this); + size, subExprHandler(GetSourceExpr()), GetSourceMemoryVersion(), loc); case MLIL_LOAD_STRUCT_SSA: return dest->LoadStructSSA(size, subExprHandler(GetSourceExpr()), - GetOffset(), GetSourceMemoryVersion(), *this); + GetOffset(), GetSourceMemoryVersion(), loc); case MLIL_NEG: case MLIL_NOT: case MLIL_SX: @@ -1784,7 +1788,7 @@ ExprId MediumLevelILInstruction::CopyTo(MediumLevelILFunction* dest, case MLIL_FLOOR: case MLIL_CEIL: case MLIL_FTRUNC: - return dest->AddExprWithLocation(operation, *this, size, subExprHandler(AsOneOperand().GetSourceExpr())); + return dest->AddExprWithLocation(operation, loc, size, subExprHandler(AsOneOperand().GetSourceExpr())); case MLIL_ADD: case MLIL_SUB: case MLIL_AND: @@ -1830,13 +1834,13 @@ ExprId MediumLevelILInstruction::CopyTo(MediumLevelILFunction* dest, case MLIL_FCMP_GT: case MLIL_FCMP_O: case MLIL_FCMP_UO: - return dest->AddExprWithLocation(operation, *this, size, subExprHandler(AsTwoOperand().GetLeftExpr()), + return dest->AddExprWithLocation(operation, loc, size, subExprHandler(AsTwoOperand().GetLeftExpr()), subExprHandler(AsTwoOperand().GetRightExpr())); case MLIL_ADC: case MLIL_SBB: case MLIL_RLC: case MLIL_RRC: - return dest->AddExprWithLocation(operation, *this, size, subExprHandler(AsTwoOperandWithCarry().GetLeftExpr()), + return dest->AddExprWithLocation(operation, loc, size, subExprHandler(AsTwoOperandWithCarry().GetLeftExpr()), subExprHandler(AsTwoOperandWithCarry().GetRightExpr()), subExprHandler(AsTwoOperandWithCarry().GetCarryExpr())); case MLIL_JUMP_TO: @@ -1846,10 +1850,10 @@ ExprId MediumLevelILInstruction::CopyTo(MediumLevelILFunction* dest, { labelA = dest->GetLabelForSourceInstruction(target.second); if (!labelA) - return dest->Jump(subExprHandler(GetDestExpr()), *this); + return dest->Jump(subExprHandler(GetDestExpr()), loc); labelList[target.first] = labelA; } - return dest->JumpTo(subExprHandler(GetDestExpr()), labelList, *this); + return dest->JumpTo(subExprHandler(GetDestExpr()), labelList, loc); } case MLIL_GOTO: labelA = dest->GetLabelForSourceInstruction(GetTarget()); @@ -1857,56 +1861,56 @@ ExprId MediumLevelILInstruction::CopyTo(MediumLevelILFunction* dest, { return dest->Jump(dest->ConstPointer(function->GetArchitecture()->GetAddressSize(), function->GetInstruction(GetTarget()).address), - *this); + loc); } - return dest->Goto(*labelA, *this); + return dest->Goto(*labelA, loc); case MLIL_IF: labelA = dest->GetLabelForSourceInstruction(GetTrueTarget()); labelB = dest->GetLabelForSourceInstruction(GetFalseTarget()); if ((!labelA) || (!labelB)) - return dest->Undefined(*this); - return dest->If(subExprHandler(GetConditionExpr()), *labelA, *labelB, *this); + return dest->Undefined(loc); + return dest->If(subExprHandler(GetConditionExpr()), *labelA, *labelB, loc); case MLIL_CONST: - return dest->Const(size, GetConstant(), *this); + return dest->Const(size, GetConstant(), loc); case MLIL_CONST_PTR: - return dest->ConstPointer(size, GetConstant(), *this); + return dest->ConstPointer(size, GetConstant(), loc); case MLIL_EXTERN_PTR: - return dest->ExternPointer(size, GetConstant(), GetOffset(), *this); + return dest->ExternPointer(size, GetConstant(), GetOffset(), loc); case MLIL_FLOAT_CONST: - return dest->FloatConstRaw(size, GetConstant(), *this); + return dest->FloatConstRaw(size, GetConstant(), loc); case MLIL_IMPORT: - return dest->ImportedAddress(size, GetConstant(), *this); + return dest->ImportedAddress(size, GetConstant(), loc); case MLIL_CONST_DATA: - return dest->ConstData(size, GetConstantData(), *this); + return dest->ConstData(size, GetConstantData(), loc); case MLIL_BP: - return dest->Breakpoint(*this); + return dest->Breakpoint(loc); case MLIL_TRAP: - return dest->Trap(GetVector(), *this); + return dest->Trap(GetVector(), loc); case MLIL_INTRINSIC: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); - return dest->Intrinsic(GetOutputVariables(), GetIntrinsic(), params, *this); + return dest->Intrinsic(GetOutputVariables(), GetIntrinsic(), params, loc); case MLIL_INTRINSIC_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->IntrinsicSSA( - GetOutputSSAVariables(), GetIntrinsic(), params, *this); + GetOutputSSAVariables(), GetIntrinsic(), params, loc); case MLIL_MEMORY_INTRINSIC_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->MemoryIntrinsicSSA(GetOutputSSAVariables(), GetIntrinsic(), params, GetDestMemoryVersion(), - GetSourceMemoryVersion(), *this); + GetSourceMemoryVersion(), loc); case MLIL_FREE_VAR_SLOT: - return dest->FreeVarSlot(GetDestVariable(), *this); + return dest->FreeVarSlot(GetDestVariable(), loc); case MLIL_FREE_VAR_SLOT_SSA: return dest->FreeVarSlotSSA(GetDestSSAVariable().var, GetDestSSAVariable().version, - GetSourceSSAVariable().version, *this); + GetSourceSSAVariable().version, loc); case MLIL_UNDEF: - return dest->Undefined(*this); + return dest->Undefined(loc); case MLIL_UNIMPL: - return dest->Unimplemented(*this); + return dest->Unimplemented(loc); default: throw MediumLevelILInstructionAccessException(); } -- cgit v1.3.1