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 --- highlevelilinstruction.cpp | 133 +++++++++++++++++++++++---------------------- 1 file changed, 68 insertions(+), 65 deletions(-) (limited to 'highlevelilinstruction.cpp') diff --git a/highlevelilinstruction.cpp b/highlevelilinstruction.cpp index 6fe43618..0861cf31 100644 --- a/highlevelilinstruction.cpp +++ b/highlevelilinstruction.cpp @@ -1370,162 +1370,165 @@ void HighLevelILInstruction::VisitExprs(const std::function& subExprHandler) const + HighLevelILFunction* dest, const std::function& subExprHandler, const ILSourceLocation& sourceLocation) const { vector output, params; + + const auto& loc = sourceLocation.valid ? sourceLocation : ILSourceLocation{*this}; + switch (operation) { case HLIL_NOP: - return dest->Nop(*this); + return dest->Nop(loc); case HLIL_BLOCK: for (auto i : GetBlockExprs()) params.push_back(subExprHandler(i)); - return dest->Block(params, *this); + return dest->Block(params, loc); case HLIL_IF: return dest->If(subExprHandler(GetConditionExpr()), subExprHandler(GetTrueExpr()), - subExprHandler(GetFalseExpr()), *this); + subExprHandler(GetFalseExpr()), loc); case HLIL_WHILE: return dest->While( - subExprHandler(GetConditionExpr()), subExprHandler(GetLoopExpr()), *this); + subExprHandler(GetConditionExpr()), subExprHandler(GetLoopExpr()), loc); case HLIL_WHILE_SSA: return dest->WhileSSA(subExprHandler(GetConditionPhiExpr()), - subExprHandler(GetConditionExpr()), subExprHandler(GetLoopExpr()), *this); + subExprHandler(GetConditionExpr()), subExprHandler(GetLoopExpr()), loc); case HLIL_DO_WHILE: return dest->DoWhile( - subExprHandler(GetLoopExpr()), subExprHandler(GetConditionExpr()), *this); + subExprHandler(GetLoopExpr()), subExprHandler(GetConditionExpr()), loc); case HLIL_DO_WHILE_SSA: return dest->DoWhileSSA(subExprHandler(GetLoopExpr()), subExprHandler(GetConditionPhiExpr()), - subExprHandler(GetConditionExpr()), *this); + subExprHandler(GetConditionExpr()), loc); case HLIL_FOR: return dest->For(subExprHandler(GetInitExpr()), subExprHandler(GetConditionExpr()), - subExprHandler(GetUpdateExpr()), subExprHandler(GetLoopExpr()), *this); + subExprHandler(GetUpdateExpr()), subExprHandler(GetLoopExpr()), loc); case HLIL_FOR_SSA: return dest->ForSSA(subExprHandler(GetInitExpr()), subExprHandler(GetConditionPhiExpr()), subExprHandler(GetConditionExpr()), - subExprHandler(GetUpdateExpr()), subExprHandler(GetLoopExpr()), *this); + subExprHandler(GetUpdateExpr()), subExprHandler(GetLoopExpr()), loc); case HLIL_SWITCH: for (auto i : GetCases()) params.push_back(subExprHandler(i)); return dest->Switch(subExprHandler(GetConditionExpr()), - subExprHandler(GetDefaultExpr()), params, *this); + subExprHandler(GetDefaultExpr()), params, loc); case HLIL_CASE: for (auto i : GetValueExprs()) params.push_back(subExprHandler(i)); - return dest->Case(params, subExprHandler(GetTrueExpr()), *this); + return dest->Case(params, subExprHandler(GetTrueExpr()), loc); case HLIL_BREAK: - return dest->Break(*this); + return dest->Break(loc); case HLIL_CONTINUE: - return dest->Continue(*this); + return dest->Continue(loc); case HLIL_GOTO: - return dest->Goto(GetTarget(), *this); + return dest->Goto(GetTarget(), loc); case HLIL_LABEL: - return dest->Label(GetTarget(), *this); + return dest->Label(GetTarget(), loc); case HLIL_VAR_DECLARE: - return dest->VarDeclare(GetVariable(), *this); + return dest->VarDeclare(GetVariable(), loc); case HLIL_VAR_INIT: return dest->VarInit( - size, GetDestVariable(), subExprHandler(GetSourceExpr()), *this); + size, GetDestVariable(), subExprHandler(GetSourceExpr()), loc); case HLIL_VAR_INIT_SSA: return dest->VarInitSSA( - size, GetDestSSAVariable(), subExprHandler(GetSourceExpr()), *this); + size, GetDestSSAVariable(), subExprHandler(GetSourceExpr()), loc); case HLIL_ASSIGN: return dest->Assign( - size, subExprHandler(GetDestExpr()), subExprHandler(GetSourceExpr()), *this); + size, subExprHandler(GetDestExpr()), subExprHandler(GetSourceExpr()), loc); case HLIL_ASSIGN_UNPACK: for (auto i : GetDestExprs()) output.push_back(subExprHandler(i)); - return dest->AssignUnpack(output, subExprHandler(GetSourceExpr()), *this); + return dest->AssignUnpack(output, subExprHandler(GetSourceExpr()), loc); case HLIL_ASSIGN_MEM_SSA: return dest->AssignMemSSA(size, subExprHandler(GetDestExpr()), GetDestMemoryVersion(), subExprHandler(GetSourceExpr()), - GetSourceMemoryVersion(), *this); + GetSourceMemoryVersion(), loc); case HLIL_ASSIGN_UNPACK_MEM_SSA: for (auto i : GetDestExprs()) output.push_back(subExprHandler(i)); return dest->AssignUnpackMemSSA(output, GetDestMemoryVersion(), subExprHandler(GetSourceExpr()), - GetSourceMemoryVersion(), *this); + GetSourceMemoryVersion(), loc); case HLIL_FORCE_VER: - return dest->ForceVer(size, GetDestVariable(), GetVariable(), *this); + return dest->ForceVer(size, GetDestVariable(), GetVariable(), loc); case HLIL_FORCE_VER_SSA: - return dest->ForceVerSSA(size, GetDestSSAVariable(), GetSSAVariable(), *this); + return dest->ForceVerSSA(size, GetDestSSAVariable(), GetSSAVariable(), loc); case HLIL_ASSERT: - return dest->Assert(size, GetVariable(), GetConstraint(), *this); + return dest->Assert(size, GetVariable(), GetConstraint(), loc); case HLIL_ASSERT_SSA: - return dest->AssertSSA(size, GetSSAVariable(), GetConstraint(), *this); + return dest->AssertSSA(size, GetSSAVariable(), GetConstraint(), loc); case HLIL_VAR: - return dest->Var(size, GetVariable(), *this); + return dest->Var(size, GetVariable(), loc); case HLIL_VAR_SSA: - return dest->VarSSA(size, GetSSAVariable(), *this); + return dest->VarSSA(size, GetSSAVariable(), loc); case HLIL_VAR_PHI: - return dest->VarPhi(GetDestSSAVariable(), GetSourceSSAVariables(), *this); + return dest->VarPhi(GetDestSSAVariable(), GetSourceSSAVariables(), loc); case HLIL_MEM_PHI: - return dest->MemPhi(GetDestMemoryVersion(), GetSourceMemoryVersions(), *this); + return dest->MemPhi(GetDestMemoryVersion(), GetSourceMemoryVersions(), loc); case HLIL_STRUCT_FIELD: return dest->StructField(size, subExprHandler(GetSourceExpr()), - GetOffset(), GetMemberIndex(), *this); + GetOffset(), GetMemberIndex(), loc); case HLIL_ARRAY_INDEX: return dest->ArrayIndex(size, subExprHandler(GetSourceExpr()), - subExprHandler(GetIndexExpr()), *this); + subExprHandler(GetIndexExpr()), loc); case HLIL_ARRAY_INDEX_SSA: return dest->ArrayIndexSSA(size, subExprHandler(GetSourceExpr()), GetSourceMemoryVersion(), subExprHandler(GetIndexExpr()), - *this); + loc); case HLIL_SPLIT: return dest->Split( - size, subExprHandler(GetHighExpr()), subExprHandler(GetLowExpr()), *this); + size, subExprHandler(GetHighExpr()), subExprHandler(GetLowExpr()), loc); case HLIL_DEREF: - return dest->Deref(size, subExprHandler(GetSourceExpr()), *this); + return dest->Deref(size, subExprHandler(GetSourceExpr()), loc); case HLIL_DEREF_FIELD: return dest->DerefField(size, subExprHandler(GetSourceExpr()), GetOffset(), - GetMemberIndex(), *this); + GetMemberIndex(), loc); case HLIL_DEREF_SSA: return dest->DerefSSA( - size, subExprHandler(GetSourceExpr()), GetSourceMemoryVersion(), *this); + size, subExprHandler(GetSourceExpr()), GetSourceMemoryVersion(), loc); case HLIL_DEREF_FIELD_SSA: return dest->DerefFieldSSA(size, subExprHandler(GetSourceExpr()), GetSourceMemoryVersion(), GetOffset(), - GetMemberIndex(), *this); + GetMemberIndex(), loc); case HLIL_ADDRESS_OF: - return dest->AddressOf(subExprHandler(GetSourceExpr()), *this); + return dest->AddressOf(subExprHandler(GetSourceExpr()), loc); case HLIL_CALL: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); - return dest->Call(subExprHandler(GetDestExpr()), params, *this); + return dest->Call(subExprHandler(GetDestExpr()), params, loc); case HLIL_SYSCALL: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); - return dest->Syscall(params, *this); + return dest->Syscall(params, loc); case HLIL_TAILCALL: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); - return dest->TailCall(subExprHandler(GetDestExpr()), params, *this); + return dest->TailCall(subExprHandler(GetDestExpr()), params, loc); case HLIL_CALL_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->CallSSA(subExprHandler(GetDestExpr()), params, - GetDestMemoryVersion(), GetSourceMemoryVersion(), *this); + GetDestMemoryVersion(), GetSourceMemoryVersion(), loc); case HLIL_SYSCALL_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->SyscallSSA( - params, GetDestMemoryVersion(), GetSourceMemoryVersion(), *this); + params, GetDestMemoryVersion(), GetSourceMemoryVersion(), loc); case HLIL_RET: for (auto i : GetSourceExprs()) params.push_back(subExprHandler(i)); - return dest->Return(params, *this); + return dest->Return(params, loc); case HLIL_NORET: - return dest->NoReturn(*this); + return dest->NoReturn(loc); case HLIL_UNREACHABLE: - return dest->Unreachable(*this); + return dest->Unreachable(loc); case HLIL_NEG: case HLIL_NOT: case HLIL_SX: @@ -1544,7 +1547,7 @@ ExprId HighLevelILInstruction::CopyTo( case HLIL_FLOOR: case HLIL_CEIL: case HLIL_FTRUNC: - return dest->AddExprWithLocation(operation, *this, size, subExprHandler(AsOneOperand().GetSourceExpr())); + return dest->AddExprWithLocation(operation, loc, size, subExprHandler(AsOneOperand().GetSourceExpr())); case HLIL_ADD: case HLIL_SUB: case HLIL_AND: @@ -1590,44 +1593,44 @@ ExprId HighLevelILInstruction::CopyTo( case HLIL_FCMP_GT: case HLIL_FCMP_O: case HLIL_FCMP_UO: - return dest->AddExprWithLocation(operation, *this, size, subExprHandler(AsTwoOperand().GetLeftExpr()), + return dest->AddExprWithLocation(operation, loc, size, subExprHandler(AsTwoOperand().GetLeftExpr()), subExprHandler(AsTwoOperand().GetRightExpr())); case HLIL_ADC: case HLIL_SBB: case HLIL_RLC: case HLIL_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 HLIL_CONST: - return dest->Const(size, GetConstant(), *this); + return dest->Const(size, GetConstant(), loc); case HLIL_CONST_PTR: - return dest->ConstPointer(size, GetConstant(), *this); + return dest->ConstPointer(size, GetConstant(), loc); case HLIL_EXTERN_PTR: - return dest->ExternPointer(size, GetConstant(), GetOffset(), *this); + return dest->ExternPointer(size, GetConstant(), GetOffset(), loc); case HLIL_FLOAT_CONST: - return dest->FloatConstRaw(size, GetConstant(), *this); + return dest->FloatConstRaw(size, GetConstant(), loc); case HLIL_IMPORT: - return dest->ImportedAddress(size, GetConstant(), *this); + return dest->ImportedAddress(size, GetConstant(), loc); case HLIL_CONST_DATA: - return dest->ConstData(size, GetConstantData(), *this); + return dest->ConstData(size, GetConstantData(), loc); case HLIL_BP: - return dest->Breakpoint(*this); + return dest->Breakpoint(loc); case HLIL_TRAP: - return dest->Trap(GetVector(), *this); + return dest->Trap(GetVector(), loc); case HLIL_INTRINSIC: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); - return dest->Intrinsic(GetIntrinsic(), params, *this); + return dest->Intrinsic(GetIntrinsic(), params, loc); case HLIL_INTRINSIC_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->IntrinsicSSA(GetIntrinsic(), params, - GetDestMemoryVersion(), GetSourceMemoryVersion(), *this); + GetDestMemoryVersion(), GetSourceMemoryVersion(), loc); case HLIL_UNDEF: - return dest->Undefined(*this); + return dest->Undefined(loc); case HLIL_UNIMPL: - return dest->Unimplemented(*this); + return dest->Unimplemented(loc); default: throw HighLevelILInstructionAccessException(); } -- cgit v1.3.1