summaryrefslogtreecommitdiff
path: root/lowlevelilinstruction.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2017-08-29 20:13:57 -0400
committerRusty Wagner <rusty@vector35.com>2017-08-29 20:15:48 -0400
commit47333ef2460edfa9b5ba5be26fd19f80c0d8d8b6 (patch)
tree65eb1e071548ca49b6dff6866fba922fed004cbe /lowlevelilinstruction.cpp
parent09af54fba214ee5e0baf6a9bacce0ceebbd34deb (diff)
Updating APIs to deal with stack adjustment
Diffstat (limited to 'lowlevelilinstruction.cpp')
-rw-r--r--lowlevelilinstruction.cpp27
1 files changed, 25 insertions, 2 deletions
diff --git a/lowlevelilinstruction.cpp b/lowlevelilinstruction.cpp
index 19bfd983..d85e4f17 100644
--- a/lowlevelilinstruction.cpp
+++ b/lowlevelilinstruction.cpp
@@ -60,6 +60,7 @@ unordered_map<LowLevelILOperandUsage, LowLevelILOperandType>
{LowSSARegisterLowLevelOperandUsage, SSARegisterLowLevelOperand},
{ConstantLowLevelOperandUsage, IntegerLowLevelOperand},
{VectorLowLevelOperandUsage, IntegerLowLevelOperand},
+ {StackAdjustmentLowLevelOperandUsage, IntegerLowLevelOperand},
{TargetLowLevelOperandUsage, IndexLowLevelOperand},
{TrueTargetLowLevelOperandUsage, IndexLowLevelOperand},
{FalseTargetLowLevelOperandUsage, IndexLowLevelOperand},
@@ -111,6 +112,7 @@ unordered_map<BNLowLevelILOperation, vector<LowLevelILOperandUsage>>
{LLIL_JUMP, {DestExprLowLevelOperandUsage}},
{LLIL_JUMP_TO, {DestExprLowLevelOperandUsage, TargetListLowLevelOperandUsage}},
{LLIL_CALL, {DestExprLowLevelOperandUsage}},
+ {LLIL_CALL_STACK_ADJUST, {DestExprLowLevelOperandUsage, StackAdjustmentLowLevelOperandUsage}},
{LLIL_RET, {DestExprLowLevelOperandUsage}},
{LLIL_IF, {ConditionExprLowLevelOperandUsage, TrueTargetLowLevelOperandUsage,
FalseTargetLowLevelOperandUsage}},
@@ -1020,7 +1022,7 @@ LowLevelILInstruction LowLevelILInstructionBase::GetSSAForm() const
return *this;
size_t expr = GetSSAExprIndex();
size_t instr = GetSSAInstructionIndex();
- return LowLevelILInstruction(ssa, ssa->GetRawExpr(GetSSAExprIndex()), expr, instr);
+ return LowLevelILInstruction(ssa, ssa->GetRawExpr(expr), expr, instr);
}
@@ -1031,7 +1033,7 @@ LowLevelILInstruction LowLevelILInstructionBase::GetNonSSAForm() const
return *this;
size_t expr = GetNonSSAExprIndex();
size_t instr = GetNonSSAInstructionIndex();
- return LowLevelILInstruction(nonSsa, nonSsa->GetRawExpr(GetSSAExprIndex()), expr, instr);
+ return LowLevelILInstruction(nonSsa, nonSsa->GetRawExpr(expr), expr, instr);
}
@@ -1160,6 +1162,9 @@ void LowLevelILInstruction::VisitExprs(const std::function<bool(const LowLevelIL
case LLIL_CALL:
GetDestExpr<LLIL_CALL>().VisitExprs(func);
break;
+ case LLIL_CALL_STACK_ADJUST:
+ GetDestExpr<LLIL_CALL_STACK_ADJUST>().VisitExprs(func);
+ break;
case LLIL_CALL_SSA:
GetDestExpr<LLIL_CALL_SSA>().VisitExprs(func);
break;
@@ -1301,6 +1306,9 @@ ExprId LowLevelILInstruction::CopyTo(LowLevelILFunction* dest,
return dest->Jump(subExprHandler(GetDestExpr<LLIL_JUMP>()), *this);
case LLIL_CALL:
return dest->Call(subExprHandler(GetDestExpr<LLIL_CALL>()), *this);
+ case LLIL_CALL_STACK_ADJUST:
+ return dest->CallStackAdjust(subExprHandler(GetDestExpr<LLIL_CALL_STACK_ADJUST>()),
+ GetStackAdjustment<LLIL_CALL_STACK_ADJUST>(), *this);
case LLIL_RET:
return dest->Return(subExprHandler(GetDestExpr<LLIL_RET>()), *this);
case LLIL_JUMP_TO:
@@ -1647,6 +1655,15 @@ int64_t LowLevelILInstruction::GetVector() const
}
+size_t LowLevelILInstruction::GetStackAdjustment() const
+{
+ size_t operandIndex;
+ if (GetOperandIndexForUsage(StackAdjustmentLowLevelOperandUsage, operandIndex))
+ return (size_t)GetRawOperandAsInteger(operandIndex);
+ throw LowLevelILInstructionAccessException();
+}
+
+
size_t LowLevelILInstruction::GetTarget() const
{
size_t operandIndex;
@@ -2133,6 +2150,12 @@ ExprId LowLevelILFunction::Call(ExprId dest, const ILSourceLocation& loc)
}
+ExprId LowLevelILFunction::CallStackAdjust(ExprId dest, size_t adjust, const ILSourceLocation& loc)
+{
+ return AddExprWithLocation(LLIL_CALL_STACK_ADJUST, loc, 0, 0, dest, adjust);
+}
+
+
ExprId LowLevelILFunction::CallSSA(const vector<SSARegister>& output, ExprId dest, const vector<SSARegister>& params,
const SSARegister& stack, size_t newMemoryVer, size_t prevMemoryVer, const ILSourceLocation& loc)
{