summaryrefslogtreecommitdiff
path: root/highlevelilinstruction.cpp
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2023-02-04 15:23:52 -0500
committerBrian Potchik <brian@vector35.com>2023-02-04 15:23:52 -0500
commit1a7d06b3b8044ccdee4e3ff0883a33bf8cce487f (patch)
tree6779d6b368acfcad57474e0fd12c1ae4158f5c38 /highlevelilinstruction.cpp
parent4005984260466439560545040850557922003325 (diff)
Initial support for constant data expressions.
Diffstat (limited to 'highlevelilinstruction.cpp')
-rw-r--r--highlevelilinstruction.cpp78
1 files changed, 57 insertions, 21 deletions
diff --git a/highlevelilinstruction.cpp b/highlevelilinstruction.cpp
index e9c2676d..608b2fac 100644
--- a/highlevelilinstruction.cpp
+++ b/highlevelilinstruction.cpp
@@ -38,25 +38,38 @@ using namespace std;
unordered_map<HighLevelILOperandUsage, HighLevelILOperandType> HighLevelILInstructionBase::operandTypeForUsage = {
- {SourceExprHighLevelOperandUsage, ExprHighLevelOperand}, {VariableHighLevelOperandUsage, VariableHighLevelOperand},
+ {SourceExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {VariableHighLevelOperandUsage, VariableHighLevelOperand},
{DestVariableHighLevelOperandUsage, VariableHighLevelOperand},
{SSAVariableHighLevelOperandUsage, SSAVariableHighLevelOperand},
{DestSSAVariableHighLevelOperandUsage, SSAVariableHighLevelOperand},
- {DestExprHighLevelOperandUsage, ExprHighLevelOperand}, {LeftExprHighLevelOperandUsage, ExprHighLevelOperand},
- {RightExprHighLevelOperandUsage, ExprHighLevelOperand}, {CarryExprHighLevelOperandUsage, ExprHighLevelOperand},
- {IndexExprHighLevelOperandUsage, ExprHighLevelOperand}, {ConditionExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {DestExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {LeftExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {RightExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {CarryExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {IndexExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {ConditionExprHighLevelOperandUsage, ExprHighLevelOperand},
{ConditionPhiExprHighLevelOperandUsage, ExprHighLevelOperand},
- {TrueExprHighLevelOperandUsage, ExprHighLevelOperand}, {FalseExprHighLevelOperandUsage, ExprHighLevelOperand},
- {LoopExprHighLevelOperandUsage, ExprHighLevelOperand}, {InitExprHighLevelOperandUsage, ExprHighLevelOperand},
- {UpdateExprHighLevelOperandUsage, ExprHighLevelOperand}, {DefaultExprHighLevelOperandUsage, ExprHighLevelOperand},
- {HighExprHighLevelOperandUsage, ExprHighLevelOperand}, {LowExprHighLevelOperandUsage, ExprHighLevelOperand},
- {OffsetHighLevelOperandUsage, IntegerHighLevelOperand}, {MemberIndexHighLevelOperandUsage, IndexHighLevelOperand},
- {ConstantHighLevelOperandUsage, IntegerHighLevelOperand}, {VectorHighLevelOperandUsage, IntegerHighLevelOperand},
- {IntrinsicHighLevelOperandUsage, IntrinsicHighLevelOperand}, {TargetHighLevelOperandUsage, IndexHighLevelOperand},
+ {TrueExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {FalseExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {LoopExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {InitExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {UpdateExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {DefaultExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {HighExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {LowExprHighLevelOperandUsage, ExprHighLevelOperand},
+ {OffsetHighLevelOperandUsage, IntegerHighLevelOperand},
+ {MemberIndexHighLevelOperandUsage, IndexHighLevelOperand},
+ {ConstantHighLevelOperandUsage, IntegerHighLevelOperand},
+ {ConstantDataHighLevelOperandUsage, ConstantDataHighLevelOperand},
+ {VectorHighLevelOperandUsage, IntegerHighLevelOperand},
+ {IntrinsicHighLevelOperandUsage, IntrinsicHighLevelOperand},
+ {TargetHighLevelOperandUsage, IndexHighLevelOperand},
{ParameterExprsHighLevelOperandUsage, ExprListHighLevelOperand},
{SourceExprsHighLevelOperandUsage, ExprListHighLevelOperand},
{DestExprsHighLevelOperandUsage, ExprListHighLevelOperand},
- {BlockExprsHighLevelOperandUsage, ExprListHighLevelOperand}, {CasesHighLevelOperandUsage, ExprListHighLevelOperand},
+ {BlockExprsHighLevelOperandUsage, ExprListHighLevelOperand},
+ {CasesHighLevelOperandUsage, ExprListHighLevelOperand},
{ValueExprsHighLevelOperandUsage, ExprListHighLevelOperand},
{SourceSSAVariablesHighLevelOperandUsage, SSAVariableListHighLevelOperand},
{SourceMemoryVersionHighLevelOperandUsage, IndexHighLevelOperand},
@@ -122,10 +135,10 @@ unordered_map<BNHighLevelILOperation, vector<HighLevelILOperandUsage>>
DestMemoryVersionHighLevelOperandUsage, SourceMemoryVersionHighLevelOperandUsage}},
{HLIL_TRAP, {VectorHighLevelOperandUsage}},
{HLIL_CONST, {ConstantHighLevelOperandUsage}},
- {HLIL_CONST_DATA, {ConstantHighLevelOperandUsage}},
{HLIL_CONST_PTR, {ConstantHighLevelOperandUsage}},
{HLIL_EXTERN_PTR, {ConstantHighLevelOperandUsage, OffsetHighLevelOperandUsage}},
{HLIL_FLOAT_CONST, {ConstantHighLevelOperandUsage}}, {HLIL_IMPORT, {ConstantHighLevelOperandUsage}},
+ {HLIL_CONST_DATA, {ConstantDataHighLevelOperandUsage}},
{HLIL_ADD, {LeftExprHighLevelOperandUsage, RightExprHighLevelOperandUsage}},
{HLIL_SUB, {LeftExprHighLevelOperandUsage, RightExprHighLevelOperandUsage}},
{HLIL_AND, {LeftExprHighLevelOperandUsage, RightExprHighLevelOperandUsage}},
@@ -511,6 +524,14 @@ uint64_t HighLevelILOperand::GetInteger() const
}
+ConstantData HighLevelILOperand::GetConstantData() const
+{
+ if (m_type != ConstantDataHighLevelOperand)
+ throw HighLevelILInstructionAccessException();
+ return m_instr.GetRawOperandAsConstantData(m_operandIndex);
+}
+
+
size_t HighLevelILOperand::GetIndex() const
{
if (m_type != IndexHighLevelOperand)
@@ -708,6 +729,12 @@ uint64_t HighLevelILInstructionBase::GetRawOperandAsInteger(size_t operand) cons
}
+ConstantData HighLevelILInstructionBase::GetRawOperandAsConstantData(size_t operand) const
+{
+ return ConstantData((BNRegisterValueType)operands[operand], (uint64_t)operands[operand + 1], size, function->GetFunction());
+}
+
+
size_t HighLevelILInstructionBase::GetRawOperandAsIndex(size_t operand) const
{
return (size_t)operands[operand];
@@ -1491,8 +1518,6 @@ ExprId HighLevelILInstruction::CopyTo(
subExprHandler(AsTwoOperandWithCarry().GetCarryExpr()));
case HLIL_CONST:
return dest->Const(size, GetConstant<HLIL_CONST>(), *this);
- case HLIL_CONST_DATA:
- return dest->ConstData(size, GetConstant<HLIL_CONST_DATA>(), *this);
case HLIL_CONST_PTR:
return dest->ConstPointer(size, GetConstant<HLIL_CONST_PTR>(), *this);
case HLIL_EXTERN_PTR:
@@ -1501,6 +1526,8 @@ ExprId HighLevelILInstruction::CopyTo(
return dest->FloatConstRaw(size, GetConstant<HLIL_FLOAT_CONST>(), *this);
case HLIL_IMPORT:
return dest->ImportedAddress(size, GetConstant<HLIL_IMPORT>(), *this);
+ case HLIL_CONST_DATA:
+ return dest->ConstData(size, GetConstantData<HLIL_CONST_DATA>(), *this);
case HLIL_BP:
return dest->Breakpoint(*this);
case HLIL_TRAP:
@@ -2281,6 +2308,15 @@ int64_t HighLevelILInstruction::GetConstant() const
}
+ConstantData HighLevelILInstruction::GetConstantData() const
+{
+ size_t operandIndex;
+ if (GetOperandIndexForUsage(ConstantDataHighLevelOperandUsage, operandIndex))
+ return GetRawOperandAsConstantData(operandIndex);
+ throw HighLevelILInstructionAccessException();
+}
+
+
int64_t HighLevelILInstruction::GetVector() const
{
size_t operandIndex;
@@ -2652,12 +2688,6 @@ ExprId HighLevelILFunction::Const(size_t size, uint64_t val, const ILSourceLocat
}
-ExprId HighLevelILFunction::ConstData(size_t size, uint64_t addr, const ILSourceLocation& loc)
-{
- return AddExprWithLocation(HLIL_CONST_DATA, loc, size, addr);
-}
-
-
ExprId HighLevelILFunction::ConstPointer(size_t size, uint64_t val, const ILSourceLocation& loc)
{
return AddExprWithLocation(HLIL_CONST_PTR, loc, size, val);
@@ -2706,6 +2736,12 @@ ExprId HighLevelILFunction::ImportedAddress(size_t size, uint64_t val, const ILS
}
+ExprId HighLevelILFunction::ConstData(size_t size, const ConstantData& data, const ILSourceLocation& loc)
+{
+ return AddExprWithLocation(HLIL_CONST_DATA, loc, size, data.state, data.value);
+}
+
+
ExprId HighLevelILFunction::Add(size_t size, ExprId left, ExprId right, const ILSourceLocation& loc)
{
return AddExprWithLocation(HLIL_ADD, loc, size, left, right);