summaryrefslogtreecommitdiff
path: root/architecture.cpp
diff options
context:
space:
mode:
authorRyan Snyder <ryan@vector35.com>2025-07-03 01:48:11 -0400
committerRyan Snyder <ryan@vector35.com>2025-07-03 04:30:58 -0400
commite96a7a078a9909fc1212861c9669e6af0b034e46 (patch)
tree412f072f118f7f784e8500f8bb46dfad0354bc82 /architecture.cpp
parent3bfeb0e19d97c71022bb5c50c2a21e129f675e1b (diff)
api: indirect branch inlining support
Diffstat (limited to 'architecture.cpp')
-rw-r--r--architecture.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/architecture.cpp b/architecture.cpp
index bd476049..6db5b6b5 100644
--- a/architecture.cpp
+++ b/architecture.cpp
@@ -298,6 +298,15 @@ std::set<ArchAndAddr>& BasicBlockAnalysisContext::GetHaltedDisassemblyAddresses(
}
+std::map<ArchAndAddr, ArchAndAddr>& BasicBlockAnalysisContext::GetInlinedUnresolvedIndirectBranches()
+{
+ if (!m_inlinedUnresolvedIndirectBranches)
+ m_inlinedUnresolvedIndirectBranches.emplace();
+
+ return *m_inlinedUnresolvedIndirectBranches;
+}
+
+
void BasicBlockAnalysisContext::AddTempOutgoingReference(Function* targetFunc)
{
BNAnalyzeBasicBlocksContextAddTempReference(m_context, targetFunc->m_object);
@@ -386,6 +395,29 @@ void BasicBlockAnalysisContext::Finalize()
delete[] haltedAddresses;
}
+ if (m_inlinedUnresolvedIndirectBranches)
+ {
+ auto& inlinedUnresolvedIndirectBranches = *m_inlinedUnresolvedIndirectBranches;
+
+ BNArchitectureAndAddress* locations = new BNArchitectureAndAddress[inlinedUnresolvedIndirectBranches.size() * 2];
+
+ size_t i = 0;
+ for (auto& pair : inlinedUnresolvedIndirectBranches)
+ {
+ locations[i].arch = pair.first.arch->GetObject();
+ locations[i].address = pair.first.address;
+
+ locations[i + 1].arch = pair.second.arch->GetObject();
+ locations[i + 1].address = pair.second.address;
+
+ i += 2;
+ }
+
+ BNAnalyzeBasicBlocksContextSetInlinedUnresolvedIndirectBranches(m_context, locations, inlinedUnresolvedIndirectBranches.size() * 2);
+
+ delete[] locations;
+ }
+
if (m_contextualReturns)
{
auto& contextualReturns = *m_contextualReturns;