diff options
| author | Glenn Smith <glenn@vector35.com> | 2025-07-31 17:25:18 -0400 |
|---|---|---|
| committer | Glenn Smith <glenn@vector35.com> | 2025-08-01 21:37:38 -0400 |
| commit | 0996601386125530284705160083919973992954 (patch) | |
| tree | 7895b9760de2b57f774662c519a04dded925aece /workflow.cpp | |
| parent | 2060680204071270772751237542247038184451 (diff) | |
Support MLIL expr mappings in C++
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() + ); } |
