@@ -96,6 +96,7 @@ static constexpr std::array s_operandTypeForUsage = {
9696 OperandUsageType{ParameterSSAMemoryVersionMediumLevelOperandUsage, IndexMediumLevelOperand},
9797 OperandUsageType{SourceSSAVariablesMediumLevelOperandUsages, SSAVariableListMediumLevelOperand},
9898 OperandUsageType{ConstraintMediumLevelOperandUsage, ConstraintMediumLevelOperand},
99+ OperandUsageType{ForceVersionReasonMediumLevelOperandUsage, ForceVersionReasonMediumLevelOperand},
99100};
100101
101102static_assert (std::is_sorted(s_operandTypeForUsage.begin(), s_operandTypeForUsage.end()),
@@ -160,7 +161,7 @@ static constexpr std::array s_instructionOperandUsage = {
160161 OperandUsage{MLIL_SET_VAR_FIELD , {DestVariableMediumLevelOperandUsage, OffsetMediumLevelOperandUsage, SourceExprMediumLevelOperandUsage}},
161162 OperandUsage{MLIL_SET_VAR_SPLIT , {HighVariableMediumLevelOperandUsage, LowVariableMediumLevelOperandUsage, SourceExprMediumLevelOperandUsage}},
162163 OperandUsage{MLIL_ASSERT , {SourceVariableMediumLevelOperandUsage, ConstraintMediumLevelOperandUsage}},
163- OperandUsage{MLIL_FORCE_VER , {DestVariableMediumLevelOperandUsage, SourceVariableMediumLevelOperandUsage}},
164+ OperandUsage{MLIL_FORCE_VER , {DestVariableMediumLevelOperandUsage, SourceVariableMediumLevelOperandUsage, ForceVersionReasonMediumLevelOperandUsage }},
164165 OperandUsage{MLIL_LOAD , {SourceExprMediumLevelOperandUsage}},
165166 OperandUsage{MLIL_LOAD_STRUCT , {SourceExprMediumLevelOperandUsage, OffsetMediumLevelOperandUsage}},
166167 OperandUsage{MLIL_STORE , {DestExprMediumLevelOperandUsage, SourceExprMediumLevelOperandUsage}},
@@ -280,7 +281,7 @@ static constexpr std::array s_instructionOperandUsage = {
280281 OperandUsage{MLIL_VAR_ALIASED_FIELD , {SourceSSAVariableMediumLevelOperandUsage, OffsetMediumLevelOperandUsage}},
281282 OperandUsage{MLIL_VAR_SPLIT_SSA , {HighSSAVariableMediumLevelOperandUsage, LowSSAVariableMediumLevelOperandUsage}},
282283 OperandUsage{MLIL_ASSERT_SSA , {SourceSSAVariableMediumLevelOperandUsage, ConstraintMediumLevelOperandUsage}},
283- OperandUsage{MLIL_FORCE_VER_SSA , {DestSSAVariableMediumLevelOperandUsage, SourceSSAVariableMediumLevelOperandUsage}},
284+ OperandUsage{MLIL_FORCE_VER_SSA , {DestSSAVariableMediumLevelOperandUsage, SourceSSAVariableMediumLevelOperandUsage, ForceVersionReasonMediumLevelOperandUsage }},
284285 OperandUsage{MLIL_CALL_SSA , {OutputExprsSubExprMediumLevelOperandUsage, OutputSSAMemoryVersionMediumLevelOperandUsage, DestExprMediumLevelOperandUsage, ParameterExprsMediumLevelOperandUsage, SourceMemoryVersionMediumLevelOperandUsage}},
285286 OperandUsage{MLIL_CALL_UNTYPED_SSA , {OutputExprsSubExprMediumLevelOperandUsage, OutputSSAMemoryVersionMediumLevelOperandUsage, DestExprMediumLevelOperandUsage, UntypedParameterSSAExprsMediumLevelOperandUsage, ParameterSSAMemoryVersionMediumLevelOperandUsage, StackExprMediumLevelOperandUsage}},
286287 OperandUsage{MLIL_SYSCALL_SSA , {OutputExprsSubExprMediumLevelOperandUsage, OutputSSAMemoryVersionMediumLevelOperandUsage, ParameterExprsMediumLevelOperandUsage, SourceMemoryVersionMediumLevelOperandUsage}},
@@ -1724,9 +1725,11 @@ ExprId MediumLevelILInstruction::CopyTo(MediumLevelILFunction* dest,
17241725 GetSourceSSAVariable<MLIL_VAR_OUTPUT_ALIASED_FIELD >().version ,
17251726 GetOffset<MLIL_VAR_OUTPUT_ALIASED_FIELD >(), loc);
17261727 case MLIL_FORCE_VER :
1727- return dest->ForceVer (size, GetDestVariable<MLIL_FORCE_VER >(), GetSourceVariable<MLIL_FORCE_VER >(), loc);
1728+ return dest->ForceVer (size, GetDestVariable<MLIL_FORCE_VER >(), GetSourceVariable<MLIL_FORCE_VER >(),
1729+ GetForceVersionReason<MLIL_FORCE_VER >(), loc);
17281730 case MLIL_FORCE_VER_SSA :
1729- return dest->ForceVerSSA (size, GetDestSSAVariable<MLIL_FORCE_VER_SSA >(), GetSourceSSAVariable<MLIL_FORCE_VER_SSA >(), loc);
1731+ return dest->ForceVerSSA (size, GetDestSSAVariable<MLIL_FORCE_VER_SSA >(), GetSourceSSAVariable<MLIL_FORCE_VER_SSA >(),
1732+ GetForceVersionReason<MLIL_FORCE_VER_SSA >(), loc);
17301733 case MLIL_ASSERT :
17311734 return dest->Assert (size, GetSourceVariable<MLIL_ASSERT >(), GetConstraint<MLIL_ASSERT >(), loc);
17321735 case MLIL_ASSERT_SSA :
@@ -2375,6 +2378,15 @@ MediumLevelILSSAVariableList MediumLevelILInstruction::GetSourceSSAVariables() c
23752378}
23762379
23772380
2381+ BNForceVersionReason MediumLevelILInstruction::GetForceVersionReason () const
2382+ {
2383+ size_t operandIndex;
2384+ if (GetOperandIndexForUsage (ForceVersionReasonMediumLevelOperandUsage, operandIndex))
2385+ return (BNForceVersionReason)GetRawOperandAsInteger (operandIndex);
2386+ throw MediumLevelILInstructionAccessException ();
2387+ }
2388+
2389+
23782390vector<Variable> MediumLevelILCallInstruction::GetOutputVariables () const
23792391{
23802392 vector<Variable> result;
@@ -2486,15 +2498,18 @@ ExprId MediumLevelILFunction::SetVarAliasedField(size_t size, const Variable& de
24862498}
24872499
24882500
2489- ExprId MediumLevelILFunction::ForceVer (size_t size, const Variable& dest, const Variable& src, const ILSourceLocation& loc)
2501+ ExprId MediumLevelILFunction::ForceVer (size_t size, const Variable& dest, const Variable& src,
2502+ BNForceVersionReason reason, const ILSourceLocation& loc)
24902503{
2491- return AddExprWithLocation (MLIL_FORCE_VER , loc, size, dest.ToIdentifier (), src.ToIdentifier ());
2504+ return AddExprWithLocation (MLIL_FORCE_VER , loc, size, dest.ToIdentifier (), src.ToIdentifier (), reason );
24922505}
24932506
24942507
2495- ExprId MediumLevelILFunction::ForceVerSSA (size_t size, const SSAVariable& dest, const SSAVariable& src, const ILSourceLocation& loc)
2508+ ExprId MediumLevelILFunction::ForceVerSSA (size_t size, const SSAVariable& dest, const SSAVariable& src,
2509+ BNForceVersionReason reason, const ILSourceLocation& loc)
24962510{
2497- return AddExprWithLocation (MLIL_FORCE_VER_SSA , loc, size, dest.var .ToIdentifier (), dest.version , src.var .ToIdentifier (), src.version );
2511+ return AddExprWithLocation (MLIL_FORCE_VER_SSA , loc, size, dest.var .ToIdentifier (), dest.version ,
2512+ src.var .ToIdentifier (), src.version , reason);
24982513}
24992514
25002515
0 commit comments