summaryrefslogtreecommitdiff
path: root/binaryview.cpp
diff options
context:
space:
mode:
authorrollsafe <rollsafe@users.noreply.github.com>2019-07-30 21:48:38 -0400
committerrollsafe <rollsafe@users.noreply.github.com>2019-07-31 20:29:46 -0400
commit9bb1a15b800da0ac5b60c40e3b10321e4efc5a1b (patch)
tree9f24e377b1e2db29b0ce8aff5ec4b217010789db /binaryview.cpp
parenta8e440c27cf81b91d040a6b3ac495b8dfb9ada8e (diff)
Cache function callee addresses and create an API to access them
Diffstat (limited to 'binaryview.cpp')
-rw-r--r--binaryview.cpp36
1 files changed, 34 insertions, 2 deletions
diff --git a/binaryview.cpp b/binaryview.cpp
index 7806c656..fd93b340 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -1513,7 +1513,7 @@ vector<uint64_t> BinaryView::GetCodeReferencesFrom(ReferenceSource src)
BNReferenceSource _src{ src.func->m_object, src.arch->m_object, src.addr };
uint64_t* refs = BNGetCodeReferencesFrom(m_object, &_src, &count);
vector<uint64_t> result(refs, &refs[count]);
- BNFreeCodeReferencesFrom(refs);
+ BNFreeAddressList(refs);
return result;
}
@@ -1524,7 +1524,7 @@ vector<uint64_t> BinaryView::GetCodeReferencesFrom(ReferenceSource src, uint64_t
BNReferenceSource _src{ src.func->m_object, src.arch->m_object, src.addr };
uint64_t* refs = BNGetCodeReferencesFromInRange(m_object, &_src, len, &count);
vector<uint64_t> result(refs, &refs[count]);
- BNFreeCodeReferencesFrom(refs);
+ BNFreeAddressList(refs);
return result;
}
@@ -1581,6 +1581,38 @@ void BinaryView::RemoveUserDataReference(uint64_t fromAddr, uint64_t toAddr)
}
+vector<uint64_t> BinaryView::GetCallees(ReferenceSource callSite)
+{
+ size_t count;
+ BNReferenceSource src { callSite.func->m_object, callSite.arch->m_object, callSite.addr };
+ uint64_t* refs = BNGetCallees(m_object, &src, &count);
+ vector<uint64_t> result(refs, &refs[count]);
+ BNFreeAddressList(refs);
+ return result;
+}
+
+
+vector<ReferenceSource> BinaryView::GetCallers(uint64_t addr)
+{
+ size_t count;
+ BNReferenceSource* refs = BNGetCallers(m_object, addr, &count);
+
+ vector<ReferenceSource> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ ReferenceSource src;
+ src.func = new Function(BNNewFunctionReference(refs[i].func));
+ src.arch = new CoreArchitecture(refs[i].arch);
+ src.addr = refs[i].addr;
+ result.push_back(src);
+ }
+
+ BNFreeCodeReferences(refs, count);
+ return result;
+}
+
+
Ref<Symbol> BinaryView::GetSymbolByAddress(uint64_t addr, const NameSpace& nameSpace)
{
BNNameSpace ns = nameSpace.GetAPIObject();