@@ -1370,162 +1370,165 @@ void HighLevelILInstruction::VisitExprs(const std::function<bool(const HighLevel
13701370}
13711371
13721372
1373- ExprId HighLevelILInstruction::CopyTo (HighLevelILFunction* dest) const
1373+ ExprId HighLevelILInstruction::CopyTo (HighLevelILFunction* dest, const ILSourceLocation& sourceLocation ) const
13741374{
1375- return CopyTo (dest, [&](const HighLevelILInstruction& subExpr) { return subExpr.CopyTo (dest); });
1375+ return CopyTo (dest, [&](const HighLevelILInstruction& subExpr) { return subExpr.CopyTo (dest, sourceLocation ); }, sourceLocation );
13761376}
13771377
13781378
13791379ExprId HighLevelILInstruction::CopyTo (
1380- HighLevelILFunction* dest, const std::function<ExprId(const HighLevelILInstruction& subExpr)>& subExprHandler) const
1380+ HighLevelILFunction* dest, const std::function<ExprId(const HighLevelILInstruction& subExpr)>& subExprHandler, const ILSourceLocation& sourceLocation ) const
13811381{
13821382 vector<ExprId> output, params;
1383+
1384+ const auto & loc = sourceLocation.valid ? sourceLocation : ILSourceLocation{*this };
1385+
13831386 switch (operation)
13841387 {
13851388 case HLIL_NOP:
1386- return dest->Nop (* this );
1389+ return dest->Nop (loc );
13871390 case HLIL_BLOCK:
13881391 for (auto i : GetBlockExprs<HLIL_BLOCK>())
13891392 params.push_back (subExprHandler (i));
1390- return dest->Block (params, * this );
1393+ return dest->Block (params, loc );
13911394 case HLIL_IF:
13921395 return dest->If (subExprHandler (GetConditionExpr<HLIL_IF>()), subExprHandler (GetTrueExpr<HLIL_IF>()),
1393- subExprHandler (GetFalseExpr<HLIL_IF>()), * this );
1396+ subExprHandler (GetFalseExpr<HLIL_IF>()), loc );
13941397 case HLIL_WHILE:
13951398 return dest->While (
1396- subExprHandler (GetConditionExpr<HLIL_WHILE>()), subExprHandler (GetLoopExpr<HLIL_WHILE>()), * this );
1399+ subExprHandler (GetConditionExpr<HLIL_WHILE>()), subExprHandler (GetLoopExpr<HLIL_WHILE>()), loc );
13971400 case HLIL_WHILE_SSA:
13981401 return dest->WhileSSA (subExprHandler (GetConditionPhiExpr<HLIL_WHILE_SSA>()),
1399- subExprHandler (GetConditionExpr<HLIL_WHILE_SSA>()), subExprHandler (GetLoopExpr<HLIL_WHILE_SSA>()), * this );
1402+ subExprHandler (GetConditionExpr<HLIL_WHILE_SSA>()), subExprHandler (GetLoopExpr<HLIL_WHILE_SSA>()), loc );
14001403 case HLIL_DO_WHILE:
14011404 return dest->DoWhile (
1402- subExprHandler (GetLoopExpr<HLIL_DO_WHILE>()), subExprHandler (GetConditionExpr<HLIL_DO_WHILE>()), * this );
1405+ subExprHandler (GetLoopExpr<HLIL_DO_WHILE>()), subExprHandler (GetConditionExpr<HLIL_DO_WHILE>()), loc );
14031406 case HLIL_DO_WHILE_SSA:
14041407 return dest->DoWhileSSA (subExprHandler (GetLoopExpr<HLIL_DO_WHILE_SSA>()),
14051408 subExprHandler (GetConditionPhiExpr<HLIL_DO_WHILE_SSA>()),
1406- subExprHandler (GetConditionExpr<HLIL_DO_WHILE_SSA>()), * this );
1409+ subExprHandler (GetConditionExpr<HLIL_DO_WHILE_SSA>()), loc );
14071410 case HLIL_FOR:
14081411 return dest->For (subExprHandler (GetInitExpr<HLIL_FOR>()), subExprHandler (GetConditionExpr<HLIL_FOR>()),
1409- subExprHandler (GetUpdateExpr<HLIL_FOR>()), subExprHandler (GetLoopExpr<HLIL_FOR>()), * this );
1412+ subExprHandler (GetUpdateExpr<HLIL_FOR>()), subExprHandler (GetLoopExpr<HLIL_FOR>()), loc );
14101413 case HLIL_FOR_SSA:
14111414 return dest->ForSSA (subExprHandler (GetInitExpr<HLIL_FOR_SSA>()),
14121415 subExprHandler (GetConditionPhiExpr<HLIL_FOR_SSA>()), subExprHandler (GetConditionExpr<HLIL_FOR_SSA>()),
1413- subExprHandler (GetUpdateExpr<HLIL_FOR_SSA>()), subExprHandler (GetLoopExpr<HLIL_FOR_SSA>()), * this );
1416+ subExprHandler (GetUpdateExpr<HLIL_FOR_SSA>()), subExprHandler (GetLoopExpr<HLIL_FOR_SSA>()), loc );
14141417 case HLIL_SWITCH:
14151418 for (auto i : GetCases<HLIL_SWITCH>())
14161419 params.push_back (subExprHandler (i));
14171420 return dest->Switch (subExprHandler (GetConditionExpr<HLIL_SWITCH>()),
1418- subExprHandler (GetDefaultExpr<HLIL_SWITCH>()), params, * this );
1421+ subExprHandler (GetDefaultExpr<HLIL_SWITCH>()), params, loc );
14191422 case HLIL_CASE:
14201423 for (auto i : GetValueExprs<HLIL_CASE>())
14211424 params.push_back (subExprHandler (i));
1422- return dest->Case (params, subExprHandler (GetTrueExpr<HLIL_CASE>()), * this );
1425+ return dest->Case (params, subExprHandler (GetTrueExpr<HLIL_CASE>()), loc );
14231426 case HLIL_BREAK:
1424- return dest->Break (* this );
1427+ return dest->Break (loc );
14251428 case HLIL_CONTINUE:
1426- return dest->Continue (* this );
1429+ return dest->Continue (loc );
14271430 case HLIL_GOTO:
1428- return dest->Goto (GetTarget<HLIL_GOTO>(), * this );
1431+ return dest->Goto (GetTarget<HLIL_GOTO>(), loc );
14291432 case HLIL_LABEL:
1430- return dest->Label (GetTarget<HLIL_LABEL>(), * this );
1433+ return dest->Label (GetTarget<HLIL_LABEL>(), loc );
14311434 case HLIL_VAR_DECLARE:
1432- return dest->VarDeclare (GetVariable<HLIL_VAR_DECLARE>(), * this );
1435+ return dest->VarDeclare (GetVariable<HLIL_VAR_DECLARE>(), loc );
14331436 case HLIL_VAR_INIT:
14341437 return dest->VarInit (
1435- size, GetDestVariable<HLIL_VAR_INIT>(), subExprHandler (GetSourceExpr<HLIL_VAR_INIT>()), * this );
1438+ size, GetDestVariable<HLIL_VAR_INIT>(), subExprHandler (GetSourceExpr<HLIL_VAR_INIT>()), loc );
14361439 case HLIL_VAR_INIT_SSA:
14371440 return dest->VarInitSSA (
1438- size, GetDestSSAVariable<HLIL_VAR_INIT_SSA>(), subExprHandler (GetSourceExpr<HLIL_VAR_INIT_SSA>()), * this );
1441+ size, GetDestSSAVariable<HLIL_VAR_INIT_SSA>(), subExprHandler (GetSourceExpr<HLIL_VAR_INIT_SSA>()), loc );
14391442 case HLIL_ASSIGN:
14401443 return dest->Assign (
1441- size, subExprHandler (GetDestExpr<HLIL_ASSIGN>()), subExprHandler (GetSourceExpr<HLIL_ASSIGN>()), * this );
1444+ size, subExprHandler (GetDestExpr<HLIL_ASSIGN>()), subExprHandler (GetSourceExpr<HLIL_ASSIGN>()), loc );
14421445 case HLIL_ASSIGN_UNPACK:
14431446 for (auto i : GetDestExprs<HLIL_ASSIGN_UNPACK>())
14441447 output.push_back (subExprHandler (i));
1445- return dest->AssignUnpack (output, subExprHandler (GetSourceExpr<HLIL_ASSIGN_UNPACK>()), * this );
1448+ return dest->AssignUnpack (output, subExprHandler (GetSourceExpr<HLIL_ASSIGN_UNPACK>()), loc );
14461449 case HLIL_ASSIGN_MEM_SSA:
14471450 return dest->AssignMemSSA (size, subExprHandler (GetDestExpr<HLIL_ASSIGN_MEM_SSA>()),
14481451 GetDestMemoryVersion<HLIL_ASSIGN_MEM_SSA>(), subExprHandler (GetSourceExpr<HLIL_ASSIGN_MEM_SSA>()),
1449- GetSourceMemoryVersion<HLIL_ASSIGN_MEM_SSA>(), * this );
1452+ GetSourceMemoryVersion<HLIL_ASSIGN_MEM_SSA>(), loc );
14501453 case HLIL_ASSIGN_UNPACK_MEM_SSA:
14511454 for (auto i : GetDestExprs<HLIL_ASSIGN_UNPACK_MEM_SSA>())
14521455 output.push_back (subExprHandler (i));
14531456 return dest->AssignUnpackMemSSA (output, GetDestMemoryVersion<HLIL_ASSIGN_UNPACK_MEM_SSA>(),
14541457 subExprHandler (GetSourceExpr<HLIL_ASSIGN_UNPACK_MEM_SSA>()),
1455- GetSourceMemoryVersion<HLIL_ASSIGN_UNPACK_MEM_SSA>(), * this );
1458+ GetSourceMemoryVersion<HLIL_ASSIGN_UNPACK_MEM_SSA>(), loc );
14561459 case HLIL_FORCE_VER:
1457- return dest->ForceVer (size, GetDestVariable<HLIL_FORCE_VER>(), GetVariable<HLIL_FORCE_VER>(), * this );
1460+ return dest->ForceVer (size, GetDestVariable<HLIL_FORCE_VER>(), GetVariable<HLIL_FORCE_VER>(), loc );
14581461 case HLIL_FORCE_VER_SSA:
1459- return dest->ForceVerSSA (size, GetDestSSAVariable<HLIL_FORCE_VER_SSA>(), GetSSAVariable<HLIL_FORCE_VER_SSA>(), * this );
1462+ return dest->ForceVerSSA (size, GetDestSSAVariable<HLIL_FORCE_VER_SSA>(), GetSSAVariable<HLIL_FORCE_VER_SSA>(), loc );
14601463 case HLIL_ASSERT:
1461- return dest->Assert (size, GetVariable<HLIL_ASSERT>(), GetConstraint<HLIL_ASSERT>(), * this );
1464+ return dest->Assert (size, GetVariable<HLIL_ASSERT>(), GetConstraint<HLIL_ASSERT>(), loc );
14621465 case HLIL_ASSERT_SSA:
1463- return dest->AssertSSA (size, GetSSAVariable<HLIL_ASSERT_SSA>(), GetConstraint<HLIL_ASSERT_SSA>(), * this );
1466+ return dest->AssertSSA (size, GetSSAVariable<HLIL_ASSERT_SSA>(), GetConstraint<HLIL_ASSERT_SSA>(), loc );
14641467 case HLIL_VAR:
1465- return dest->Var (size, GetVariable<HLIL_VAR>(), * this );
1468+ return dest->Var (size, GetVariable<HLIL_VAR>(), loc );
14661469 case HLIL_VAR_SSA:
1467- return dest->VarSSA (size, GetSSAVariable<HLIL_VAR_SSA>(), * this );
1470+ return dest->VarSSA (size, GetSSAVariable<HLIL_VAR_SSA>(), loc );
14681471 case HLIL_VAR_PHI:
1469- return dest->VarPhi (GetDestSSAVariable<HLIL_VAR_PHI>(), GetSourceSSAVariables<HLIL_VAR_PHI>(), * this );
1472+ return dest->VarPhi (GetDestSSAVariable<HLIL_VAR_PHI>(), GetSourceSSAVariables<HLIL_VAR_PHI>(), loc );
14701473 case HLIL_MEM_PHI:
1471- return dest->MemPhi (GetDestMemoryVersion<HLIL_MEM_PHI>(), GetSourceMemoryVersions<HLIL_MEM_PHI>(), * this );
1474+ return dest->MemPhi (GetDestMemoryVersion<HLIL_MEM_PHI>(), GetSourceMemoryVersions<HLIL_MEM_PHI>(), loc );
14721475 case HLIL_STRUCT_FIELD:
14731476 return dest->StructField (size, subExprHandler (GetSourceExpr<HLIL_STRUCT_FIELD>()),
1474- GetOffset<HLIL_STRUCT_FIELD>(), GetMemberIndex<HLIL_STRUCT_FIELD>(), * this );
1477+ GetOffset<HLIL_STRUCT_FIELD>(), GetMemberIndex<HLIL_STRUCT_FIELD>(), loc );
14751478 case HLIL_ARRAY_INDEX:
14761479 return dest->ArrayIndex (size, subExprHandler (GetSourceExpr<HLIL_ARRAY_INDEX>()),
1477- subExprHandler (GetIndexExpr<HLIL_ARRAY_INDEX>()), * this );
1480+ subExprHandler (GetIndexExpr<HLIL_ARRAY_INDEX>()), loc );
14781481 case HLIL_ARRAY_INDEX_SSA:
14791482 return dest->ArrayIndexSSA (size, subExprHandler (GetSourceExpr<HLIL_ARRAY_INDEX_SSA>()),
14801483 GetSourceMemoryVersion<HLIL_ARRAY_INDEX_SSA>(), subExprHandler (GetIndexExpr<HLIL_ARRAY_INDEX_SSA>()),
1481- * this );
1484+ loc );
14821485 case HLIL_SPLIT:
14831486 return dest->Split (
1484- size, subExprHandler (GetHighExpr<HLIL_SPLIT>()), subExprHandler (GetLowExpr<HLIL_SPLIT>()), * this );
1487+ size, subExprHandler (GetHighExpr<HLIL_SPLIT>()), subExprHandler (GetLowExpr<HLIL_SPLIT>()), loc );
14851488 case HLIL_DEREF:
1486- return dest->Deref (size, subExprHandler (GetSourceExpr<HLIL_DEREF>()), * this );
1489+ return dest->Deref (size, subExprHandler (GetSourceExpr<HLIL_DEREF>()), loc );
14871490 case HLIL_DEREF_FIELD:
14881491 return dest->DerefField (size, subExprHandler (GetSourceExpr<HLIL_DEREF_FIELD>()), GetOffset<HLIL_DEREF_FIELD>(),
1489- GetMemberIndex<HLIL_DEREF_FIELD>(), * this );
1492+ GetMemberIndex<HLIL_DEREF_FIELD>(), loc );
14901493 case HLIL_DEREF_SSA:
14911494 return dest->DerefSSA (
1492- size, subExprHandler (GetSourceExpr<HLIL_DEREF_SSA>()), GetSourceMemoryVersion<HLIL_DEREF_SSA>(), * this );
1495+ size, subExprHandler (GetSourceExpr<HLIL_DEREF_SSA>()), GetSourceMemoryVersion<HLIL_DEREF_SSA>(), loc );
14931496 case HLIL_DEREF_FIELD_SSA:
14941497 return dest->DerefFieldSSA (size, subExprHandler (GetSourceExpr<HLIL_DEREF_FIELD_SSA>()),
14951498 GetSourceMemoryVersion<HLIL_DEREF_FIELD_SSA>(), GetOffset<HLIL_DEREF_FIELD_SSA>(),
1496- GetMemberIndex<HLIL_DEREF_FIELD_SSA>(), * this );
1499+ GetMemberIndex<HLIL_DEREF_FIELD_SSA>(), loc );
14971500 case HLIL_ADDRESS_OF:
1498- return dest->AddressOf (subExprHandler (GetSourceExpr<HLIL_ADDRESS_OF>()), * this );
1501+ return dest->AddressOf (subExprHandler (GetSourceExpr<HLIL_ADDRESS_OF>()), loc );
14991502 case HLIL_CALL:
15001503 for (auto i : GetParameterExprs<HLIL_CALL>())
15011504 params.push_back (subExprHandler (i));
1502- return dest->Call (subExprHandler (GetDestExpr<HLIL_CALL>()), params, * this );
1505+ return dest->Call (subExprHandler (GetDestExpr<HLIL_CALL>()), params, loc );
15031506 case HLIL_SYSCALL:
15041507 for (auto i : GetParameterExprs<HLIL_SYSCALL>())
15051508 params.push_back (subExprHandler (i));
1506- return dest->Syscall (params, * this );
1509+ return dest->Syscall (params, loc );
15071510 case HLIL_TAILCALL:
15081511 for (auto i : GetParameterExprs<HLIL_TAILCALL>())
15091512 params.push_back (subExprHandler (i));
1510- return dest->TailCall (subExprHandler (GetDestExpr<HLIL_TAILCALL>()), params, * this );
1513+ return dest->TailCall (subExprHandler (GetDestExpr<HLIL_TAILCALL>()), params, loc );
15111514 case HLIL_CALL_SSA:
15121515 for (auto i : GetParameterExprs<HLIL_CALL_SSA>())
15131516 params.push_back (subExprHandler (i));
15141517 return dest->CallSSA (subExprHandler (GetDestExpr<HLIL_CALL_SSA>()), params,
1515- GetDestMemoryVersion<HLIL_CALL_SSA>(), GetSourceMemoryVersion<HLIL_CALL_SSA>(), * this );
1518+ GetDestMemoryVersion<HLIL_CALL_SSA>(), GetSourceMemoryVersion<HLIL_CALL_SSA>(), loc );
15161519 case HLIL_SYSCALL_SSA:
15171520 for (auto i : GetParameterExprs<HLIL_SYSCALL_SSA>())
15181521 params.push_back (subExprHandler (i));
15191522 return dest->SyscallSSA (
1520- params, GetDestMemoryVersion<HLIL_SYSCALL_SSA>(), GetSourceMemoryVersion<HLIL_SYSCALL_SSA>(), * this );
1523+ params, GetDestMemoryVersion<HLIL_SYSCALL_SSA>(), GetSourceMemoryVersion<HLIL_SYSCALL_SSA>(), loc );
15211524 case HLIL_RET:
15221525 for (auto i : GetSourceExprs<HLIL_RET>())
15231526 params.push_back (subExprHandler (i));
1524- return dest->Return (params, * this );
1527+ return dest->Return (params, loc );
15251528 case HLIL_NORET:
1526- return dest->NoReturn (* this );
1529+ return dest->NoReturn (loc );
15271530 case HLIL_UNREACHABLE:
1528- return dest->Unreachable (* this );
1531+ return dest->Unreachable (loc );
15291532 case HLIL_NEG:
15301533 case HLIL_NOT:
15311534 case HLIL_SX:
@@ -1544,7 +1547,7 @@ ExprId HighLevelILInstruction::CopyTo(
15441547 case HLIL_FLOOR:
15451548 case HLIL_CEIL:
15461549 case HLIL_FTRUNC:
1547- return dest->AddExprWithLocation (operation, * this , size, subExprHandler (AsOneOperand ().GetSourceExpr ()));
1550+ return dest->AddExprWithLocation (operation, loc , size, subExprHandler (AsOneOperand ().GetSourceExpr ()));
15481551 case HLIL_ADD:
15491552 case HLIL_SUB:
15501553 case HLIL_AND:
@@ -1590,44 +1593,44 @@ ExprId HighLevelILInstruction::CopyTo(
15901593 case HLIL_FCMP_GT:
15911594 case HLIL_FCMP_O:
15921595 case HLIL_FCMP_UO:
1593- return dest->AddExprWithLocation (operation, * this , size, subExprHandler (AsTwoOperand ().GetLeftExpr ()),
1596+ return dest->AddExprWithLocation (operation, loc , size, subExprHandler (AsTwoOperand ().GetLeftExpr ()),
15941597 subExprHandler (AsTwoOperand ().GetRightExpr ()));
15951598 case HLIL_ADC:
15961599 case HLIL_SBB:
15971600 case HLIL_RLC:
15981601 case HLIL_RRC:
1599- return dest->AddExprWithLocation (operation, * this , size, subExprHandler (AsTwoOperandWithCarry ().GetLeftExpr ()),
1602+ return dest->AddExprWithLocation (operation, loc , size, subExprHandler (AsTwoOperandWithCarry ().GetLeftExpr ()),
16001603 subExprHandler (AsTwoOperandWithCarry ().GetRightExpr ()),
16011604 subExprHandler (AsTwoOperandWithCarry ().GetCarryExpr ()));
16021605 case HLIL_CONST:
1603- return dest->Const (size, GetConstant<HLIL_CONST>(), * this );
1606+ return dest->Const (size, GetConstant<HLIL_CONST>(), loc );
16041607 case HLIL_CONST_PTR:
1605- return dest->ConstPointer (size, GetConstant<HLIL_CONST_PTR>(), * this );
1608+ return dest->ConstPointer (size, GetConstant<HLIL_CONST_PTR>(), loc );
16061609 case HLIL_EXTERN_PTR:
1607- return dest->ExternPointer (size, GetConstant<HLIL_EXTERN_PTR>(), GetOffset<HLIL_EXTERN_PTR>(), * this );
1610+ return dest->ExternPointer (size, GetConstant<HLIL_EXTERN_PTR>(), GetOffset<HLIL_EXTERN_PTR>(), loc );
16081611 case HLIL_FLOAT_CONST:
1609- return dest->FloatConstRaw (size, GetConstant<HLIL_FLOAT_CONST>(), * this );
1612+ return dest->FloatConstRaw (size, GetConstant<HLIL_FLOAT_CONST>(), loc );
16101613 case HLIL_IMPORT:
1611- return dest->ImportedAddress (size, GetConstant<HLIL_IMPORT>(), * this );
1614+ return dest->ImportedAddress (size, GetConstant<HLIL_IMPORT>(), loc );
16121615 case HLIL_CONST_DATA:
1613- return dest->ConstData (size, GetConstantData<HLIL_CONST_DATA>(), * this );
1616+ return dest->ConstData (size, GetConstantData<HLIL_CONST_DATA>(), loc );
16141617 case HLIL_BP:
1615- return dest->Breakpoint (* this );
1618+ return dest->Breakpoint (loc );
16161619 case HLIL_TRAP:
1617- return dest->Trap (GetVector<HLIL_TRAP>(), * this );
1620+ return dest->Trap (GetVector<HLIL_TRAP>(), loc );
16181621 case HLIL_INTRINSIC:
16191622 for (auto i : GetParameterExprs<HLIL_INTRINSIC>())
16201623 params.push_back (subExprHandler (i));
1621- return dest->Intrinsic (GetIntrinsic<HLIL_INTRINSIC>(), params, * this );
1624+ return dest->Intrinsic (GetIntrinsic<HLIL_INTRINSIC>(), params, loc );
16221625 case HLIL_INTRINSIC_SSA:
16231626 for (auto i : GetParameterExprs<HLIL_INTRINSIC_SSA>())
16241627 params.push_back (subExprHandler (i));
16251628 return dest->IntrinsicSSA (GetIntrinsic<HLIL_INTRINSIC_SSA>(), params,
1626- GetDestMemoryVersion<HLIL_INTRINSIC_SSA>(), GetSourceMemoryVersion<HLIL_INTRINSIC_SSA>(), * this );
1629+ GetDestMemoryVersion<HLIL_INTRINSIC_SSA>(), GetSourceMemoryVersion<HLIL_INTRINSIC_SSA>(), loc );
16271630 case HLIL_UNDEF:
1628- return dest->Undefined (* this );
1631+ return dest->Undefined (loc );
16291632 case HLIL_UNIMPL:
1630- return dest->Unimplemented (* this );
1633+ return dest->Unimplemented (loc );
16311634 default :
16321635 throw HighLevelILInstructionAccessException ();
16331636 }
0 commit comments