From 0996601386125530284705160083919973992954 Mon Sep 17 00:00:00 2001 From: Glenn Smith Date: Thu, 31 Jul 2025 17:25:18 -0400 Subject: Support MLIL expr mappings in C++ --- workflow.cpp | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) (limited to 'workflow.cpp') 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 lowLevelIL) } -void AnalysisContext::SetMediumLevelILFunction(Ref mediumLevelIL) +void AnalysisContext::SetMediumLevelILFunction( + Ref mediumLevelIL, + std::unordered_map llilSsaToMlilInstrMap, + std::vector 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 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() + ); } -- cgit v1.3.1