From e9604c37df479a991d131d9540fafe78c7a0f7d4 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Thu, 9 Nov 2023 18:39:55 -0500 Subject: Add LLIL/MLIL instructions to describe integer vs. floating point argument usage --- lowlevelilinstruction.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) (limited to 'lowlevelilinstruction.cpp') diff --git a/lowlevelilinstruction.cpp b/lowlevelilinstruction.cpp index a1ec2f92..e85c58b0 100644 --- a/lowlevelilinstruction.cpp +++ b/lowlevelilinstruction.cpp @@ -149,6 +149,8 @@ unordered_map> LowLevelILI {LLIL_TAILCALL_SSA, {OutputSSARegistersLowLevelOperandUsage, OutputMemoryVersionLowLevelOperandUsage, DestExprLowLevelOperandUsage, StackSSARegisterLowLevelOperandUsage, StackMemoryVersionLowLevelOperandUsage, ParameterExprsLowLevelOperandUsage}}, + {LLIL_SEPARATE_PARAM_LIST_SSA, {ParameterExprsLowLevelOperandUsage}}, + {LLIL_SHARED_PARAM_SLOT_SSA, {ParameterExprsLowLevelOperandUsage}}, {LLIL_REG_PHI, {DestSSARegisterLowLevelOperandUsage, SourceSSARegistersLowLevelOperandUsage}}, {LLIL_REG_STACK_PHI, {DestSSARegisterStackLowLevelOperandUsage, SourceSSARegisterStacksLowLevelOperandUsage}}, {LLIL_FLAG_PHI, {DestSSAFlagLowLevelOperandUsage, SourceSSAFlagsLowLevelOperandUsage}}, @@ -245,8 +247,16 @@ static unordered_map()) i.VisitExprs(func); break; + case LLIL_SEPARATE_PARAM_LIST_SSA: + for (auto i : GetParameterExprs()) + i.VisitExprs(func); + break; + case LLIL_SHARED_PARAM_SLOT_SSA: + for (auto i : GetParameterExprs()) + i.VisitExprs(func); + break; default: break; } @@ -2304,6 +2322,14 @@ ExprId LowLevelILInstruction::CopyTo( params.push_back(subExprHandler(i)); return dest->IntrinsicSSA( GetOutputSSARegisterOrFlagList(), GetIntrinsic(), params, *this); + case LLIL_SEPARATE_PARAM_LIST_SSA: + for (auto i : GetParameterExprs()) + params.push_back(subExprHandler(i)); + return dest->SeparateParamListSSA(params, *this); + case LLIL_SHARED_PARAM_SLOT_SSA: + for (auto i : GetParameterExprs()) + params.push_back(subExprHandler(i)); + return dest->SharedParamSlotSSA(params, *this); default: throw LowLevelILInstructionAccessException(); } @@ -2693,7 +2719,11 @@ LowLevelILInstructionList LowLevelILInstruction::GetParameterExprs() const { size_t operandIndex; if (GetOperandIndexForUsage(ParameterExprsLowLevelOperandUsage, operandIndex)) + { + if (operandIndex == 0) + return GetRawOperandAsExprList(0); return GetRawOperandAsExpr(operandIndex).GetRawOperandAsExprList(0); + } throw LowLevelILInstructionAccessException(); } @@ -3315,6 +3345,18 @@ ExprId LowLevelILFunction::TailCallSSA(const vector& output, ExprId } +ExprId LowLevelILFunction::SeparateParamListSSA(const vector& params, const ILSourceLocation& loc) +{ + return AddExprWithLocation(LLIL_SEPARATE_PARAM_LIST_SSA, loc, 0, 0, params.size(), AddOperandList(params)); +} + + +ExprId LowLevelILFunction::SharedParamSlotSSA(const vector& params, const ILSourceLocation& loc) +{ + return AddExprWithLocation(LLIL_SHARED_PARAM_SLOT_SSA, loc, 0, 0, params.size(), AddOperandList(params)); +} + + ExprId LowLevelILFunction::Return(size_t dest, const ILSourceLocation& loc) { return AddExprWithLocation(LLIL_RET, loc, 0, 0, dest); -- cgit v1.3.1