diff options
Diffstat (limited to 'workflow.cpp')
| -rw-r--r-- | workflow.cpp | 35 |
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() + ); } |
