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 --- lowlevelilinstruction.cpp | 151 +++++++++++++++++++++++----------------------- 1 file changed, 77 insertions(+), 74 deletions(-) (limited to 'lowlevelilinstruction.cpp') diff --git a/lowlevelilinstruction.cpp b/lowlevelilinstruction.cpp index 26f5055d..649c5c99 100644 --- a/lowlevelilinstruction.cpp +++ b/lowlevelilinstruction.cpp @@ -2064,143 +2064,146 @@ void LowLevelILInstruction::VisitExprs(const std::function& subExprHandler) const + LowLevelILFunction* dest, const std::function& subExprHandler, const ILSourceLocation& sourceLocation) const { vector params; BNLowLevelILLabel* labelA; BNLowLevelILLabel* labelB; + + const auto& loc = sourceLocation.valid ? sourceLocation : ILSourceLocation{*this}; + switch (operation) { case LLIL_NOP: - return dest->Nop(); + return dest->Nop(loc); case LLIL_SET_REG: return dest->SetRegister( - size, GetDestRegister(), subExprHandler(GetSourceExpr()), flags, *this); + size, GetDestRegister(), subExprHandler(GetSourceExpr()), flags, loc); case LLIL_SET_REG_SPLIT: return dest->SetRegisterSplit(size, GetHighRegister(), GetLowRegister(), - subExprHandler(GetSourceExpr()), flags, *this); + subExprHandler(GetSourceExpr()), flags, loc); case LLIL_SET_REG_SSA: return dest->SetRegisterSSA( - size, GetDestSSARegister(), subExprHandler(GetSourceExpr()), *this); + size, GetDestSSARegister(), subExprHandler(GetSourceExpr()), loc); case LLIL_SET_REG_SSA_PARTIAL: return dest->SetRegisterSSAPartial(size, GetDestSSARegister(), GetPartialRegister(), subExprHandler(GetSourceExpr()), - *this); + loc); case LLIL_SET_REG_SPLIT_SSA: return dest->SetRegisterSplitSSA(size, GetHighSSARegister(), GetLowSSARegister(), subExprHandler(GetSourceExpr()), - *this); + loc); case LLIL_SET_REG_STACK_REL: return dest->SetRegisterStackTopRelative(size, GetDestRegisterStack(), subExprHandler(GetDestExpr()), - subExprHandler(GetSourceExpr()), flags, *this); + subExprHandler(GetSourceExpr()), flags, loc); case LLIL_REG_STACK_PUSH: return dest->RegisterStackPush(size, GetDestRegisterStack(), - subExprHandler(GetSourceExpr()), flags, *this); + subExprHandler(GetSourceExpr()), flags, loc); case LLIL_SET_REG_STACK_REL_SSA: return dest->SetRegisterStackTopRelativeSSA(size, GetDestSSARegisterStack().regStack, GetDestSSARegisterStack().version, GetSourceSSARegisterStack().version, subExprHandler(GetDestExpr()), GetTopSSARegister(), - subExprHandler(GetSourceExpr()), *this); + subExprHandler(GetSourceExpr()), loc); case LLIL_SET_REG_STACK_ABS_SSA: return dest->SetRegisterStackAbsoluteSSA(size, GetDestSSARegisterStack().regStack, GetDestSSARegisterStack().version, GetSourceSSARegisterStack().version, GetDestRegister(), subExprHandler(GetSourceExpr()), - *this); + loc); case LLIL_SET_FLAG: - return dest->SetFlag(GetDestFlag(), subExprHandler(GetSourceExpr()), *this); + return dest->SetFlag(GetDestFlag(), subExprHandler(GetSourceExpr()), loc); case LLIL_SET_FLAG_SSA: return dest->SetFlagSSA( - GetDestSSAFlag(), subExprHandler(GetSourceExpr()), *this); + GetDestSSAFlag(), subExprHandler(GetSourceExpr()), loc); case LLIL_FORCE_VER: - return dest->ForceVer(size, GetDestRegister(), *this); + return dest->ForceVer(size, GetDestRegister(), loc); case LLIL_FORCE_VER_SSA: - return dest->ForceVerSSA(size, GetDestSSARegister(), GetSourceSSARegister(), *this); + return dest->ForceVerSSA(size, GetDestSSARegister(), GetSourceSSARegister(), loc); case LLIL_ASSERT: - return dest->Assert(size, GetSourceRegister(), GetConstraint(), *this); + return dest->Assert(size, GetSourceRegister(), GetConstraint(), loc); case LLIL_ASSERT_SSA: - return dest->AssertSSA(size, GetSourceSSARegister(), GetConstraint(), *this); + return dest->AssertSSA(size, GetSourceSSARegister(), GetConstraint(), loc); case LLIL_LOAD: - return dest->Load(size, subExprHandler(GetSourceExpr()), flags, *this); + return dest->Load(size, subExprHandler(GetSourceExpr()), flags, loc); case LLIL_LOAD_SSA: return dest->LoadSSA( - size, subExprHandler(GetSourceExpr()), GetSourceMemoryVersion(), *this); + size, subExprHandler(GetSourceExpr()), GetSourceMemoryVersion(), loc); case LLIL_STORE: return dest->Store( - size, subExprHandler(GetDestExpr()), subExprHandler(GetSourceExpr()), flags, *this); + size, subExprHandler(GetDestExpr()), subExprHandler(GetSourceExpr()), flags, loc); case LLIL_STORE_SSA: return dest->StoreSSA(size, subExprHandler(GetDestExpr()), subExprHandler(GetSourceExpr()), GetDestMemoryVersion(), - GetSourceMemoryVersion(), *this); + GetSourceMemoryVersion(), loc); case LLIL_REG: - return dest->Register(size, GetSourceRegister(), *this); + return dest->Register(size, GetSourceRegister(), loc); case LLIL_REG_SSA: - return dest->RegisterSSA(size, GetSourceSSARegister(), *this); + return dest->RegisterSSA(size, GetSourceSSARegister(), loc); case LLIL_REG_SSA_PARTIAL: return dest->RegisterSSAPartial( - size, GetSourceSSARegister(), GetPartialRegister(), *this); + size, GetSourceSSARegister(), GetPartialRegister(), loc); case LLIL_REG_SPLIT: - return dest->RegisterSplit(size, GetHighRegister(), GetLowRegister(), *this); + return dest->RegisterSplit(size, GetHighRegister(), GetLowRegister(), loc); case LLIL_REG_SPLIT_SSA: return dest->RegisterSplitSSA( - size, GetHighSSARegister(), GetLowSSARegister(), *this); + size, GetHighSSARegister(), GetLowSSARegister(), loc); case LLIL_REG_STACK_REL: return dest->RegisterStackTopRelative(size, GetSourceRegisterStack(), - subExprHandler(GetSourceExpr()), *this); + subExprHandler(GetSourceExpr()), loc); case LLIL_REG_STACK_POP: - return dest->RegisterStackPop(size, GetSourceRegisterStack(), flags, *this); + return dest->RegisterStackPop(size, GetSourceRegisterStack(), flags, loc); case LLIL_REG_STACK_FREE_REG: - return dest->RegisterStackFreeReg(GetDestRegister(), *this); + return dest->RegisterStackFreeReg(GetDestRegister(), loc); case LLIL_REG_STACK_FREE_REL: return dest->RegisterStackFreeTopRelative(GetDestRegisterStack(), - subExprHandler(GetDestExpr()), *this); + subExprHandler(GetDestExpr()), loc); case LLIL_REG_STACK_REL_SSA: return dest->RegisterStackTopRelativeSSA(size, GetSourceSSARegisterStack(), subExprHandler(GetSourceExpr()), GetTopSSARegister(), - *this); + loc); case LLIL_REG_STACK_ABS_SSA: return dest->RegisterStackAbsoluteSSA(size, GetSourceSSARegisterStack(), - GetSourceRegister(), *this); + GetSourceRegister(), loc); case LLIL_REG_STACK_FREE_REL_SSA: return dest->RegisterStackFreeTopRelativeSSA(GetDestSSARegisterStack().regStack, GetDestSSARegisterStack().version, GetSourceSSARegisterStack().version, subExprHandler(GetDestExpr()), - GetTopSSARegister(), *this); + GetTopSSARegister(), loc); case LLIL_REG_STACK_FREE_ABS_SSA: return dest->RegisterStackFreeAbsoluteSSA(GetDestSSARegisterStack().regStack, GetDestSSARegisterStack().version, GetSourceSSARegisterStack().version, - GetDestRegister(), *this); + GetDestRegister(), loc); case LLIL_FLAG: - return dest->Flag(GetSourceFlag(), *this); + return dest->Flag(GetSourceFlag(), loc); case LLIL_FLAG_SSA: - return dest->FlagSSA(GetSourceSSAFlag(), *this); + return dest->FlagSSA(GetSourceSSAFlag(), loc); case LLIL_FLAG_BIT: - return dest->FlagBit(size, GetSourceFlag(), GetBitIndex(), *this); + return dest->FlagBit(size, GetSourceFlag(), GetBitIndex(), loc); case LLIL_FLAG_BIT_SSA: - return dest->FlagBitSSA(size, GetSourceSSAFlag(), GetBitIndex(), *this); + return dest->FlagBitSSA(size, GetSourceSSAFlag(), GetBitIndex(), loc); case LLIL_JUMP: - return dest->Jump(subExprHandler(GetDestExpr()), *this); + return dest->Jump(subExprHandler(GetDestExpr()), loc); case LLIL_CALL: - return dest->Call(subExprHandler(GetDestExpr()), *this); + return dest->Call(subExprHandler(GetDestExpr()), loc); case LLIL_CALL_STACK_ADJUST: return dest->CallStackAdjust(subExprHandler(GetDestExpr()), - GetStackAdjustment(), GetRegisterStackAdjustments(), *this); + GetStackAdjustment(), GetRegisterStackAdjustments(), loc); case LLIL_TAILCALL: - return dest->TailCall(subExprHandler(GetDestExpr()), *this); + return dest->TailCall(subExprHandler(GetDestExpr()), loc); case LLIL_RET: - return dest->Return(subExprHandler(GetDestExpr()), *this); + return dest->Return(subExprHandler(GetDestExpr()), loc); case LLIL_JUMP_TO: { map labelList; @@ -2208,10 +2211,10 @@ ExprId LowLevelILInstruction::CopyTo( { 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 LLIL_GOTO: labelA = dest->GetLabelForSourceInstruction(GetTarget()); @@ -2219,63 +2222,63 @@ ExprId LowLevelILInstruction::CopyTo( { 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 LLIL_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 LLIL_FLAG_COND: - return dest->FlagCondition(GetFlagCondition(), GetSemanticFlagClass(), *this); + return dest->FlagCondition(GetFlagCondition(), GetSemanticFlagClass(), loc); case LLIL_FLAG_GROUP: - return dest->FlagGroup(GetSemanticFlagGroup(), *this); + return dest->FlagGroup(GetSemanticFlagGroup(), loc); case LLIL_TRAP: - return dest->Trap(GetVector(), *this); + return dest->Trap(GetVector(), loc); case LLIL_CALL_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->CallSSA(GetOutputSSARegisters(), subExprHandler(GetDestExpr()), params, GetStackSSARegister(), GetDestMemoryVersion(), - GetSourceMemoryVersion(), *this); + GetSourceMemoryVersion(), loc); case LLIL_SYSCALL_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->SystemCallSSA(GetOutputSSARegisters(), params, GetStackSSARegister(), GetDestMemoryVersion(), - GetSourceMemoryVersion(), *this); + GetSourceMemoryVersion(), loc); case LLIL_TAILCALL_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->TailCallSSA(GetOutputSSARegisters(), subExprHandler(GetDestExpr()), params, GetStackSSARegister(), - GetDestMemoryVersion(), GetSourceMemoryVersion(), *this); + GetDestMemoryVersion(), GetSourceMemoryVersion(), loc); case LLIL_REG_PHI: - return dest->RegisterPhi(GetDestSSARegister(), GetSourceSSARegisters(), *this); + return dest->RegisterPhi(GetDestSSARegister(), GetSourceSSARegisters(), loc); case LLIL_REG_STACK_PHI: return dest->RegisterStackPhi( - GetDestSSARegisterStack(), GetSourceSSARegisterStacks(), *this); + GetDestSSARegisterStack(), GetSourceSSARegisterStacks(), loc); case LLIL_FLAG_PHI: - return dest->FlagPhi(GetDestSSAFlag(), GetSourceSSAFlags(), *this); + return dest->FlagPhi(GetDestSSAFlag(), GetSourceSSAFlags(), loc); case LLIL_MEM_PHI: - return dest->MemoryPhi(GetDestMemoryVersion(), GetSourceMemoryVersions(), *this); + return dest->MemoryPhi(GetDestMemoryVersion(), GetSourceMemoryVersions(), loc); case LLIL_CONST: - return dest->Const(size, GetConstant(), *this); + return dest->Const(size, GetConstant(), loc); case LLIL_CONST_PTR: - return dest->ConstPointer(size, GetConstant(), *this); + return dest->ConstPointer(size, GetConstant(), loc); case LLIL_EXTERN_PTR: - return dest->ExternPointer(size, GetConstant(), GetOffset(), *this); + return dest->ExternPointer(size, GetConstant(), GetOffset(), loc); case LLIL_FLOAT_CONST: - return dest->FloatConstRaw(size, GetConstant(), *this); + return dest->FloatConstRaw(size, GetConstant(), loc); case LLIL_POP: case LLIL_NORET: case LLIL_SYSCALL: case LLIL_BP: case LLIL_UNDEF: case LLIL_UNIMPL: - return dest->AddExprWithLocation(operation, *this, size, flags); + return dest->AddExprWithLocation(operation, loc, size, flags); case LLIL_PUSH: case LLIL_NEG: case LLIL_NOT: @@ -2294,7 +2297,7 @@ ExprId LowLevelILInstruction::CopyTo( case LLIL_FLOOR: case LLIL_CEIL: case LLIL_FTRUNC: - return dest->AddExprWithLocation(operation, *this, size, flags, subExprHandler(AsOneOperand().GetSourceExpr())); + return dest->AddExprWithLocation(operation, loc, size, flags, subExprHandler(AsOneOperand().GetSourceExpr())); case LLIL_ADD: case LLIL_SUB: case LLIL_AND: @@ -2340,13 +2343,13 @@ ExprId LowLevelILInstruction::CopyTo( case LLIL_FCMP_GT: case LLIL_FCMP_O: case LLIL_FCMP_UO: - return dest->AddExprWithLocation(operation, *this, size, flags, subExprHandler(AsTwoOperand().GetLeftExpr()), + return dest->AddExprWithLocation(operation, loc, size, flags, subExprHandler(AsTwoOperand().GetLeftExpr()), subExprHandler(AsTwoOperand().GetRightExpr())); case LLIL_ADC: case LLIL_SBB: case LLIL_RLC: case LLIL_RRC: - return dest->AddExprWithLocation(operation, *this, size, flags, + return dest->AddExprWithLocation(operation, loc, size, flags, subExprHandler(AsTwoOperandWithCarry().GetLeftExpr()), subExprHandler(AsTwoOperandWithCarry().GetRightExpr()), subExprHandler(AsTwoOperandWithCarry().GetCarryExpr())); @@ -2354,25 +2357,25 @@ ExprId LowLevelILInstruction::CopyTo( for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->Intrinsic( - GetOutputRegisterOrFlagList(), GetIntrinsic(), params, flags, *this); + GetOutputRegisterOrFlagList(), GetIntrinsic(), params, flags, loc); case LLIL_INTRINSIC_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->IntrinsicSSA( - GetOutputSSARegisterOrFlagList(), GetIntrinsic(), params, *this); + GetOutputSSARegisterOrFlagList(), GetIntrinsic(), params, loc); case LLIL_MEMORY_INTRINSIC_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); return dest->MemoryIntrinsicSSA(GetOutputSSARegisterOrFlagList(), GetIntrinsic(), - params, GetDestMemoryVersion(), GetSourceMemoryVersion(), *this); + params, GetDestMemoryVersion(), GetSourceMemoryVersion(), loc); case LLIL_SEPARATE_PARAM_LIST_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); - return dest->SeparateParamListSSA(params, *this); + return dest->SeparateParamListSSA(params, loc); case LLIL_SHARED_PARAM_SLOT_SSA: for (auto i : GetParameterExprs()) params.push_back(subExprHandler(i)); - return dest->SharedParamSlotSSA(params, *this); + return dest->SharedParamSlotSSA(params, loc); default: throw LowLevelILInstructionAccessException(); } -- cgit v1.3.1