diff options
| author | Brian Potchik <brian@vector35.com> | 2024-03-02 14:38:47 -0500 |
|---|---|---|
| committer | Brian Potchik <brian@vector35.com> | 2024-03-02 14:38:47 -0500 |
| commit | 2e3b9c925390cc8b1d72a41d0564bb2862d3dba2 (patch) | |
| tree | f40495cd494b8c157a0298259019873a624dc7e2 /mediumlevelilinstruction.cpp | |
| parent | ff2aa7435c3847f6969364f5d04d0943918429be (diff) | |
Add support for memory intrinsics.
Diffstat (limited to 'mediumlevelilinstruction.cpp')
| -rw-r--r-- | mediumlevelilinstruction.cpp | 20 |
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()); |
