@@ -89,6 +89,7 @@ static constexpr std::array s_operandTypeForUsage = {
8989 OperandUsageType{BlockExprsHighLevelOperandUsage, ExprListHighLevelOperand},
9090 OperandUsageType{CasesHighLevelOperandUsage, ExprListHighLevelOperand},
9191 OperandUsageType{ValueExprsHighLevelOperandUsage, ExprListHighLevelOperand},
92+ OperandUsageType{FieldExprsHighLevelOperandUsage, ExprListHighLevelOperand},
9293 OperandUsageType{SourceSSAVariablesHighLevelOperandUsage, SSAVariableListHighLevelOperand},
9394 OperandUsageType{SourceMemoryVersionHighLevelOperandUsage, IndexHighLevelOperand},
9495 OperandUsageType{SourceMemoryVersionsHighLevelOperandUsage, IndexListHighLevelOperand},
@@ -226,6 +227,8 @@ static constexpr std::array s_instructionOperandUsage = {
226227 OperandUsage{HLIL_UNDEF },
227228 OperandUsage{HLIL_UNIMPL },
228229 OperandUsage{HLIL_UNIMPL_MEM , {SourceExprHighLevelOperandUsage}},
230+ OperandUsage{HLIL_STRUCT_INIT , {FieldExprsHighLevelOperandUsage}},
231+ OperandUsage{HLIL_STRUCT_INIT_FIELD , {OffsetHighLevelOperandUsage, MemberIndexHighLevelOperandUsage, SourceExprHighLevelOperandUsage}},
229232 OperandUsage{HLIL_FADD , {LeftExprHighLevelOperandUsage, RightExprHighLevelOperandUsage}},
230233 OperandUsage{HLIL_FSUB , {LeftExprHighLevelOperandUsage, RightExprHighLevelOperandUsage}},
231234 OperandUsage{HLIL_FMUL , {LeftExprHighLevelOperandUsage, RightExprHighLevelOperandUsage}},
@@ -1249,6 +1252,14 @@ void HighLevelILInstruction::CollectSubExprs(stack<size_t>& toProcess) const
12491252 case HLIL_DEREF_FIELD_SSA :
12501253 toProcess.push (GetSourceExpr<HLIL_DEREF_FIELD_SSA >().exprIndex );
12511254 break ;
1255+ case HLIL_STRUCT_INIT :
1256+ exprs = GetFieldExprs<HLIL_STRUCT_INIT >();
1257+ for (auto i = exprs.rbegin (); i != exprs.rend (); ++i)
1258+ toProcess.push (i->exprIndex );
1259+ break ;
1260+ case HLIL_STRUCT_INIT_FIELD :
1261+ toProcess.push (GetSourceExpr<HLIL_STRUCT_INIT_FIELD >().exprIndex );
1262+ break ;
12521263 case HLIL_CALL :
12531264 toProcess.push (GetDestExpr<HLIL_CALL >().exprIndex );
12541265 exprs = GetParameterExprs<HLIL_CALL >();
@@ -1560,6 +1571,13 @@ ExprId HighLevelILInstruction::CopyTo(
15601571 return dest->ArrayIndexSSA (size, subExprHandler (GetSourceExpr<HLIL_ARRAY_INDEX_SSA >()),
15611572 GetSourceMemoryVersion<HLIL_ARRAY_INDEX_SSA >(), subExprHandler (GetIndexExpr<HLIL_ARRAY_INDEX_SSA >()),
15621573 loc);
1574+ case HLIL_STRUCT_INIT :
1575+ for (auto i : GetFieldExprs<HLIL_STRUCT_INIT >())
1576+ params.push_back (subExprHandler (i));
1577+ return dest->StructInit (size, params, loc);
1578+ case HLIL_STRUCT_INIT_FIELD :
1579+ return dest->StructInitField (size, GetOffset<HLIL_STRUCT_INIT_FIELD >(),
1580+ GetMemberIndex<HLIL_STRUCT_INIT_FIELD >(), subExprHandler (GetSourceExpr<HLIL_STRUCT_INIT_FIELD >()), loc);
15631581 case HLIL_SPLIT :
15641582 return dest->Split (
15651583 size, subExprHandler (GetHighExpr<HLIL_SPLIT >()), subExprHandler (GetLowExpr<HLIL_SPLIT >()), loc);
@@ -1992,6 +2010,26 @@ bool HighLevelILInstruction::operator<(const HighLevelILInstruction& other) cons
19922010 if (other.GetIndexExpr <HLIL_ARRAY_INDEX_SSA >() < GetIndexExpr<HLIL_ARRAY_INDEX_SSA >())
19932011 return false ;
19942012 return GetSourceMemoryVersion<HLIL_ARRAY_INDEX_SSA >() < other.GetSourceMemoryVersion <HLIL_ARRAY_INDEX_SSA >();
2013+ case HLIL_STRUCT_INIT :
2014+ if (size < other.size )
2015+ return true ;
2016+ if (size > other.size )
2017+ return false ;
2018+ return CompareExprList (GetFieldExprs<HLIL_STRUCT_INIT >(), other.GetFieldExprs <HLIL_STRUCT_INIT >());
2019+ case HLIL_STRUCT_INIT_FIELD :
2020+ if (size < other.size )
2021+ return true ;
2022+ if (size > other.size )
2023+ return false ;
2024+ if (GetOffset<HLIL_STRUCT_INIT_FIELD >() < other.GetOffset <HLIL_STRUCT_INIT_FIELD >())
2025+ return true ;
2026+ if (other.GetOffset <HLIL_STRUCT_INIT_FIELD >() < GetOffset<HLIL_STRUCT_INIT_FIELD >())
2027+ return false ;
2028+ if (GetMemberIndex<HLIL_STRUCT_INIT_FIELD >() < other.GetMemberIndex <HLIL_STRUCT_INIT_FIELD >())
2029+ return true ;
2030+ if (other.GetMemberIndex <HLIL_STRUCT_INIT_FIELD >() < GetMemberIndex<HLIL_STRUCT_INIT_FIELD >())
2031+ return false ;
2032+ return GetSourceExpr<HLIL_STRUCT_INIT_FIELD >() < other.GetSourceExpr <HLIL_STRUCT_INIT_FIELD >();
19952033 case HLIL_SPLIT :
19962034 if (size < other.size )
19972035 return true ;
@@ -2614,6 +2652,15 @@ HighLevelILInstructionList HighLevelILInstruction::GetValueExprs() const
26142652}
26152653
26162654
2655+ HighLevelILInstructionList HighLevelILInstruction::GetFieldExprs () const
2656+ {
2657+ size_t operandIndex;
2658+ if (GetOperandIndexForUsage (FieldExprsHighLevelOperandUsage, operandIndex))
2659+ return GetRawOperandAsExprList (operandIndex);
2660+ throw HighLevelILInstructionAccessException ();
2661+ }
2662+
2663+
26172664HighLevelILSSAVariableList HighLevelILInstruction::GetSourceSSAVariables () const
26182665{
26192666 size_t operandIndex;
@@ -2916,6 +2963,19 @@ ExprId HighLevelILFunction::ArrayIndexSSA(
29162963}
29172964
29182965
2966+ ExprId HighLevelILFunction::StructInit (size_t size, const vector<ExprId>& fields, const ILSourceLocation& loc)
2967+ {
2968+ return AddExprWithLocation (HLIL_STRUCT_INIT , loc, size, fields.size (), AddOperandList (fields));
2969+ }
2970+
2971+
2972+ ExprId HighLevelILFunction::StructInitField (
2973+ size_t size, uint64_t offset, size_t memberIndex, ExprId src, const ILSourceLocation& loc)
2974+ {
2975+ return AddExprWithLocation (HLIL_STRUCT_INIT_FIELD , loc, size, offset, memberIndex, src);
2976+ }
2977+
2978+
29192979ExprId HighLevelILFunction::Deref (size_t size, ExprId src, const ILSourceLocation& loc)
29202980{
29212981 return AddExprWithLocation (HLIL_DEREF , loc, size, src);
0 commit comments