summaryrefslogtreecommitdiff
path: root/workflow.cpp
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2025-07-31 17:25:18 -0400
committerGlenn Smith <glenn@vector35.com>2025-08-01 21:37:38 -0400
commit0996601386125530284705160083919973992954 (patch)
tree7895b9760de2b57f774662c519a04dded925aece /workflow.cpp
parent2060680204071270772751237542247038184451 (diff)
Support MLIL expr mappings in C++
Diffstat (limited to 'workflow.cpp')
-rw-r--r--workflow.cpp35
1 files changed, 32 insertions, 3 deletions
diff --git a/workflow.cpp b/workflow.cpp
index 03a10c54..13c180a5 100644
--- a/workflow.cpp
+++ b/workflow.cpp
@@ -98,10 +98,39 @@ void AnalysisContext::SetLowLevelILFunction(Ref<LowLevelILFunction> lowLevelIL)
}
-void AnalysisContext::SetMediumLevelILFunction(Ref<MediumLevelILFunction> mediumLevelIL)
+void AnalysisContext::SetMediumLevelILFunction(
+ Ref<MediumLevelILFunction> mediumLevelIL,
+ std::unordered_map<size_t /* llil ssa */, size_t /* mlil */> llilSsaToMlilInstrMap,
+ std::vector<BNExprMapInfo> llilSsaToMlilExprMap
+)
{
- // TODO: Mappings FFI
- BNSetMediumLevelILFunction(m_object, mediumLevelIL->m_object, nullptr, 0, nullptr, 0);
+ if (llilSsaToMlilExprMap.empty() || llilSsaToMlilInstrMap.empty())
+ {
+ // Build up maps from existing data in the function
+ llilSsaToMlilExprMap = mediumLevelIL->GetLLILSSAToMLILExprMap(true);
+ llilSsaToMlilInstrMap = mediumLevelIL->GetLLILSSAToMLILInstrMap(true);
+ }
+
+ std::vector<size_t> instrMapVec;
+ // Technically imprecise but doesn't matter this is just reserving
+ instrMapVec.reserve(llilSsaToMlilInstrMap.size());
+ for (auto& [llilSSAIndex, mlilIndex]: llilSsaToMlilInstrMap)
+ {
+ if (instrMapVec.size() <= llilSSAIndex)
+ {
+ instrMapVec.resize(llilSSAIndex + 1, BN_INVALID_EXPR);
+ }
+ instrMapVec[llilSSAIndex] = mlilIndex;
+ }
+
+ BNSetMediumLevelILFunction(
+ m_object,
+ mediumLevelIL->m_object,
+ instrMapVec.data(),
+ instrMapVec.size(),
+ llilSsaToMlilExprMap.data(),
+ llilSsaToMlilExprMap.size()
+ );
}