From 3d5a45d8bcc7f11f89b9da6cf63be95f6d8a2a52 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Fri, 17 Jan 2020 19:45:31 -0500 Subject: Add member index for structure field HLIL instructions --- highlevelilinstruction.cpp | 55 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 14 deletions(-) (limited to 'highlevelilinstruction.cpp') diff --git a/highlevelilinstruction.cpp b/highlevelilinstruction.cpp index 80d30a92..65b51ac4 100644 --- a/highlevelilinstruction.cpp +++ b/highlevelilinstruction.cpp @@ -54,6 +54,7 @@ unordered_map {HighExprHighLevelOperandUsage, ExprHighLevelOperand}, {LowExprHighLevelOperandUsage, ExprHighLevelOperand}, {OffsetHighLevelOperandUsage, IntegerHighLevelOperand}, + {MemberIndexHighLevelOperandUsage, IndexHighLevelOperand}, {ConstantHighLevelOperandUsage, IntegerHighLevelOperand}, {VectorHighLevelOperandUsage, IntegerHighLevelOperand}, {IntrinsicHighLevelOperandUsage, IntrinsicHighLevelOperand}, @@ -104,16 +105,18 @@ unordered_map> {HLIL_VAR_SSA, {SSAVariableHighLevelOperandUsage}}, {HLIL_VAR_PHI, {DestSSAVariableHighLevelOperandUsage, SourceSSAVariablesHighLevelOperandUsage}}, {HLIL_MEM_PHI, {DestMemoryVersionHighLevelOperandUsage, SourceMemoryVersionsHighLevelOperandUsage}}, - {HLIL_STRUCT_FIELD, {SourceExprHighLevelOperandUsage, OffsetHighLevelOperandUsage}}, + {HLIL_STRUCT_FIELD, {SourceExprHighLevelOperandUsage, OffsetHighLevelOperandUsage, + MemberIndexHighLevelOperandUsage}}, {HLIL_ARRAY_INDEX, {SourceExprHighLevelOperandUsage, IndexExprHighLevelOperandUsage}}, {HLIL_ARRAY_INDEX_SSA, {SourceExprHighLevelOperandUsage, SourceMemoryVersionHighLevelOperandUsage, IndexExprHighLevelOperandUsage}}, {HLIL_SPLIT, {HighExprHighLevelOperandUsage, LowExprHighLevelOperandUsage}}, {HLIL_DEREF, {SourceExprHighLevelOperandUsage}}, - {HLIL_DEREF_FIELD, {SourceExprHighLevelOperandUsage, OffsetHighLevelOperandUsage}}, + {HLIL_DEREF_FIELD, {SourceExprHighLevelOperandUsage, OffsetHighLevelOperandUsage, + MemberIndexHighLevelOperandUsage}}, {HLIL_DEREF_SSA, {SourceExprHighLevelOperandUsage, SourceMemoryVersionHighLevelOperandUsage}}, {HLIL_DEREF_FIELD_SSA, {SourceExprHighLevelOperandUsage, SourceMemoryVersionHighLevelOperandUsage, - OffsetHighLevelOperandUsage}}, + OffsetHighLevelOperandUsage, MemberIndexHighLevelOperandUsage}}, {HLIL_ADDRESS_OF, {SourceExprHighLevelOperandUsage}}, {HLIL_CALL, {DestExprHighLevelOperandUsage, ParameterExprsHighLevelOperandUsage}}, {HLIL_SYSCALL, {ParameterExprsHighLevelOperandUsage}}, @@ -1155,7 +1158,7 @@ ExprId HighLevelILInstruction::CopyTo(HighLevelILFunction* dest, return dest->MemPhi(GetDestMemoryVersion(), GetSourceMemoryVersions(), *this); case HLIL_STRUCT_FIELD: return dest->StructField(size, subExprHandler(GetSourceExpr()), - GetOffset(), *this); + GetOffset(), GetMemberIndex(), *this); case HLIL_ARRAY_INDEX: return dest->ArrayIndex(size, subExprHandler(GetSourceExpr()), subExprHandler(GetIndexExpr()), *this); @@ -1170,13 +1173,14 @@ ExprId HighLevelILInstruction::CopyTo(HighLevelILFunction* dest, return dest->Deref(size, subExprHandler(GetSourceExpr()), *this); case HLIL_DEREF_FIELD: return dest->DerefField(size, subExprHandler(GetSourceExpr()), - GetOffset(), *this); + GetOffset(), GetMemberIndex(), *this); case HLIL_DEREF_SSA: return dest->DerefSSA(size, subExprHandler(GetSourceExpr()), GetSourceMemoryVersion(), *this); case HLIL_DEREF_FIELD_SSA: return dest->DerefFieldSSA(size, subExprHandler(GetSourceExpr()), - GetSourceMemoryVersion(), GetOffset(), *this); + GetSourceMemoryVersion(), GetOffset(), + GetMemberIndex(), *this); case HLIL_ADDRESS_OF: return dest->AddressOf(subExprHandler(GetSourceExpr()), *this); case HLIL_CALL: @@ -1474,7 +1478,11 @@ bool HighLevelILInstruction::operator<(const HighLevelILInstruction& other) cons return true; if (other.GetSourceExpr() < GetSourceExpr()) return false; - return GetOffset() < other.GetOffset(); + if (GetOffset() < other.GetOffset()) + return true; + if (other.GetOffset() < GetOffset()) + return false; + return GetMemberIndex() < other.GetMemberIndex(); case HLIL_ARRAY_INDEX: if (size < other.size) return true; @@ -1518,7 +1526,11 @@ bool HighLevelILInstruction::operator<(const HighLevelILInstruction& other) cons return true; if (other.GetSourceExpr() < GetSourceExpr()) return false; - return GetOffset() < other.GetOffset(); + if (GetOffset() < other.GetOffset()) + return true; + if (other.GetOffset() < GetOffset()) + return false; + return GetMemberIndex() < other.GetMemberIndex(); case HLIL_DEREF_SSA: if (size < other.size) return true; @@ -1542,6 +1554,10 @@ bool HighLevelILInstruction::operator<(const HighLevelILInstruction& other) cons return true; if (other.GetOffset() < GetOffset()) return false; + if (GetMemberIndex() < other.GetMemberIndex()) + return true; + if (other.GetMemberIndex() < GetMemberIndex()) + return false; return GetSourceMemoryVersion() < other.GetSourceMemoryVersion(); case HLIL_ADDRESS_OF: return GetSourceExpr() < other.GetSourceExpr(); @@ -1958,6 +1974,15 @@ uint64_t HighLevelILInstruction::GetOffset() const } +size_t HighLevelILInstruction::GetMemberIndex() const +{ + size_t operandIndex; + if (GetOperandIndexForUsage(MemberIndexHighLevelOperandUsage, operandIndex)) + return GetRawOperandAsIndex(operandIndex); + throw HighLevelILInstructionAccessException(); +} + + int64_t HighLevelILInstruction::GetConstant() const { size_t operandIndex; @@ -2233,9 +2258,10 @@ ExprId HighLevelILFunction::MemPhi(size_t dest, const vector& sources, c } -ExprId HighLevelILFunction::StructField(size_t size, ExprId src, uint64_t offset, const ILSourceLocation& loc) +ExprId HighLevelILFunction::StructField(size_t size, ExprId src, uint64_t offset, size_t memberIndex, + const ILSourceLocation& loc) { - return AddExprWithLocation(HLIL_STRUCT_FIELD, loc, size, src, offset); + return AddExprWithLocation(HLIL_STRUCT_FIELD, loc, size, src, offset, memberIndex); } @@ -2264,9 +2290,10 @@ ExprId HighLevelILFunction::Deref(size_t size, ExprId src, const ILSourceLocatio } -ExprId HighLevelILFunction::DerefField(size_t size, ExprId src, uint64_t offset, const ILSourceLocation& loc) +ExprId HighLevelILFunction::DerefField(size_t size, ExprId src, uint64_t offset, size_t memberIndex, + const ILSourceLocation& loc) { - return AddExprWithLocation(HLIL_DEREF_FIELD, loc, size, src, offset); + return AddExprWithLocation(HLIL_DEREF_FIELD, loc, size, src, offset, memberIndex); } @@ -2277,9 +2304,9 @@ ExprId HighLevelILFunction::DerefSSA(size_t size, ExprId src, size_t srcMemVersi ExprId HighLevelILFunction::DerefFieldSSA(size_t size, ExprId src, size_t srcMemVersion, - uint64_t offset, const ILSourceLocation& loc) + uint64_t offset, size_t memberIndex, const ILSourceLocation& loc) { - return AddExprWithLocation(HLIL_DEREF_FIELD_SSA, loc, size, src, srcMemVersion, offset); + return AddExprWithLocation(HLIL_DEREF_FIELD_SSA, loc, size, src, srcMemVersion, offset, memberIndex); } -- cgit v1.3.1