summaryrefslogtreecommitdiff
path: root/mediumlevelilinstruction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mediumlevelilinstruction.cpp')
-rw-r--r--mediumlevelilinstruction.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/mediumlevelilinstruction.cpp b/mediumlevelilinstruction.cpp
index 151a8463..0306a404 100644
--- a/mediumlevelilinstruction.cpp
+++ b/mediumlevelilinstruction.cpp
@@ -165,6 +165,8 @@ unordered_map<BNMediumLevelILOperation, vector<MediumLevelILOperandUsage>>
ParameterExprsMediumLevelOperandUsage}},
{MLIL_INTRINSIC_SSA, {OutputSSAVariablesMediumLevelOperandUsage, IntrinsicMediumLevelOperandUsage,
ParameterExprsMediumLevelOperandUsage}},
+ {MLIL_MEMORY_INTRINSIC_SSA, {OutputSSAVariablesSubExprMediumLevelOperandUsage, OutputSSAMemoryVersionMediumLevelOperandUsage, IntrinsicMediumLevelOperandUsage,
+ ParameterExprsMediumLevelOperandUsage, SourceMemoryVersionMediumLevelOperandUsage}},
{MLIL_FREE_VAR_SLOT, {DestVariableMediumLevelOperandUsage}},
{MLIL_FREE_VAR_SLOT_SSA,
{DestSSAVariableMediumLevelOperandUsage, PartialSSAVariableSourceMediumLevelOperandUsage}},
@@ -1590,7 +1592,8 @@ void MediumLevelILInstruction::VisitExprs(const std::function<bool(const MediumL
i.VisitExprs(func);
break;
case MLIL_INTRINSIC_SSA:
- for (auto i : GetParameterExprs<MLIL_INTRINSIC_SSA>())
+ case MLIL_MEMORY_INTRINSIC_SSA:
+ for (auto i : GetParameterExprs())
i.VisitExprs(func);
break;
default:
@@ -1904,6 +1907,12 @@ ExprId MediumLevelILInstruction::CopyTo(MediumLevelILFunction* dest,
params.push_back(subExprHandler(i));
return dest->IntrinsicSSA(
GetOutputSSAVariables<MLIL_INTRINSIC_SSA>(), GetIntrinsic<MLIL_INTRINSIC_SSA>(), params, *this);
+ case MLIL_MEMORY_INTRINSIC_SSA:
+ for (auto i : GetParameterExprs<MLIL_MEMORY_INTRINSIC_SSA>())
+ params.push_back(subExprHandler(i));
+ return dest->MemoryIntrinsicSSA(GetOutputSSAVariables<MLIL_MEMORY_INTRINSIC_SSA>(),
+ GetIntrinsic<MLIL_MEMORY_INTRINSIC_SSA>(), params, GetDestMemoryVersion<MLIL_MEMORY_INTRINSIC_SSA>(),
+ GetSourceMemoryVersion<MLIL_MEMORY_INTRINSIC_SSA>(), *this);
case MLIL_FREE_VAR_SLOT:
return dest->FreeVarSlot(GetDestVariable<MLIL_FREE_VAR_SLOT>(), *this);
case MLIL_FREE_VAR_SLOT_SSA:
@@ -2930,6 +2939,15 @@ ExprId MediumLevelILFunction::IntrinsicSSA(
}
+ExprId MediumLevelILFunction::MemoryIntrinsicSSA(const vector<SSAVariable>& outputs, uint32_t intrinsic,
+ const vector<ExprId>& params, size_t newMemVersion, size_t prevMemVersion, const ILSourceLocation& loc)
+{
+ return AddExprWithLocation(MLIL_MEMORY_INTRINSIC_SSA, loc, 0,
+ AddExprWithLocation(MLIL_MEMORY_INTRINSIC_OUTPUT_SSA, loc, 0, newMemVersion, outputs.size() * 2, AddSSAVariableList(outputs)), intrinsic,
+ params.size(), AddOperandList(params), prevMemVersion);
+}
+
+
ExprId MediumLevelILFunction::FreeVarSlot(const Variable& var, const ILSourceLocation& loc)
{
return AddExprWithLocation(MLIL_FREE_VAR_SLOT, loc, 0, var.ToIdentifier());