summaryrefslogtreecommitdiff
path: root/function.cpp
diff options
context:
space:
mode:
authorXusheng <xusheng@vector35.com>2020-11-16 17:51:46 +0800
committerXusheng <xusheng@vector35.com>2021-02-17 12:05:47 +0800
commitd9b1df165f9daad6a5229718ecd0ee50a5ef6bf1 (patch)
tree6307b8c16c80f8203bdb96ebc3d54a8d9f10b3bf /function.cpp
parentb651141704a555cf0b6c53152ab0f70d011ec8af (diff)
add support for type xref and variable xref
Diffstat (limited to 'function.cpp')
-rw-r--r--function.cpp198
1 files changed, 198 insertions, 0 deletions
diff --git a/function.cpp b/function.cpp
index 50799191..b671f283 100644
--- a/function.cpp
+++ b/function.cpp
@@ -289,6 +289,34 @@ void Function::RemoveUserCodeReference(Architecture* fromArch, uint64_t fromAddr
}
+void Function::AddUserTypeReference(Architecture* fromArch, uint64_t fromAddr, const QualifiedName& name)
+{
+ BNQualifiedName nameObj = name.GetAPIObject();
+ BNAddUserTypeReference(m_object, fromArch->GetObject(), fromAddr, &nameObj);
+}
+
+
+void Function::RemoveUserTypeReference(Architecture* fromArch, uint64_t fromAddr, const QualifiedName& name)
+{
+ BNQualifiedName nameObj = name.GetAPIObject();
+ BNRemoveUserTypeReference(m_object, fromArch->GetObject(), fromAddr, &nameObj);
+}
+
+
+void Function::AddUserTypeFieldReference(Architecture* fromArch, uint64_t fromAddr, const QualifiedName& name, uint64_t offset)
+{
+ BNQualifiedName nameObj = name.GetAPIObject();
+ BNAddUserTypeFieldReference(m_object, fromArch->GetObject(), fromAddr, &nameObj, offset);
+}
+
+
+void Function::RemoveUserTypeFieldReference(Architecture* fromArch, uint64_t fromAddr, const QualifiedName& name, uint64_t offset)
+{
+ BNQualifiedName nameObj = name.GetAPIObject();
+ BNRemoveUserTypeFieldReference(m_object, fromArch->GetObject(), fromAddr, &nameObj, offset);
+}
+
+
Ref<LowLevelILFunction> Function::GetLowLevelIL() const
{
return new LowLevelILFunction(BNGetFunctionLowLevelIL(m_object));
@@ -1971,6 +1999,176 @@ void Function::SetVariableDeadStoreElimination(const Variable& var, BNDeadStoreE
}
+vector<ILReferenceSource> Function::GetMediumLevelILVariableReferences(const Variable& var)
+{
+ size_t count;
+
+ BNVariable varData;
+ varData.type = var.type;
+ varData.index = var.index;
+ varData.storage = var.storage;
+
+ BNILReferenceSource* refs = BNGetMediumLevelILVariableReferences(m_object, &varData, &count);
+
+ vector<ILReferenceSource> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ ILReferenceSource src;
+ src.func = new Function(BNNewFunctionReference(refs[i].func));
+ src.arch = new CoreArchitecture(refs[i].arch);
+ src.addr = refs[i].addr;
+ src.type = refs[i].type;
+ src.exprId = refs[i].exprId;
+ result.push_back(src);
+ }
+
+ BNFreeILReferences(refs, count);
+ return result;
+}
+
+
+vector<VariableReferenceSource> Function::GetMediumLevelILVariableReferencesFrom(Architecture* arch, uint64_t addr)
+{
+ size_t count;
+ BNVariableReferenceSource* refs = BNGetMediumLevelILVariableReferencesFrom(m_object, arch->GetObject(), addr, &count);
+
+ vector<VariableReferenceSource> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ VariableReferenceSource src;
+ src.var.index = refs[i].var.index;
+ src.var.storage = refs[i].var.storage;
+ src.var.type = refs[i].var.type;
+
+ src.source.func = new Function(BNNewFunctionReference(refs[i].source.func));
+ src.source.arch = new CoreArchitecture(refs[i].source.arch);
+ src.source.addr = refs[i].source.addr;
+ src.source.type = refs[i].source.type;
+ src.source.exprId = refs[i].source.exprId;
+
+ result.push_back(src);
+ }
+
+ BNFreeVariableReferenceSourceList(refs, count);
+ return result;
+}
+
+
+vector<VariableReferenceSource> Function::GetMediumLevelILVariableReferencesInRange(Architecture* arch, uint64_t addr, uint64_t len)
+{
+ size_t count;
+ BNVariableReferenceSource* refs = BNGetMediumLevelILVariableReferencesInRange(m_object, arch->GetObject(), addr, len, &count);
+
+ vector<VariableReferenceSource> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ VariableReferenceSource src;
+ src.var.index = refs[i].var.index;
+ src.var.storage = refs[i].var.storage;
+ src.var.type = refs[i].var.type;
+
+ src.source.func = new Function(BNNewFunctionReference(refs[i].source.func));
+ src.source.arch = new CoreArchitecture(refs[i].source.arch);
+ src.source.addr = refs[i].source.addr;
+ src.source.type = refs[i].source.type;
+ src.source.exprId = refs[i].source.exprId;
+
+ result.push_back(src);
+ }
+
+ BNFreeVariableReferenceSourceList(refs, count);
+ return result;
+}
+
+
+vector<ILReferenceSource> Function::GetHighLevelILVariableReferences(const Variable& var)
+{
+ size_t count;
+
+ BNVariable varData;
+ varData.type = var.type;
+ varData.index = var.index;
+ varData.storage = var.storage;
+
+ BNILReferenceSource* refs = BNGetHighLevelILVariableReferences(m_object, &varData, &count);
+
+ vector<ILReferenceSource> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ ILReferenceSource src;
+ src.func = new Function(BNNewFunctionReference(refs[i].func));
+ src.arch = new CoreArchitecture(refs[i].arch);
+ src.addr = refs[i].addr;
+ src.type = refs[i].type;
+ src.exprId = refs[i].exprId;
+ result.push_back(src);
+ }
+
+ BNFreeILReferences(refs, count);
+ return result;
+}
+
+
+vector<VariableReferenceSource> Function::GetHighLevelILVariableReferencesFrom(Architecture* arch, uint64_t addr)
+{
+ size_t count;
+ BNVariableReferenceSource* refs = BNGetHighLevelILVariableReferencesFrom(m_object, arch->GetObject(), addr, &count);
+
+ vector<VariableReferenceSource> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ VariableReferenceSource src;
+ src.var.index = refs[i].var.index;
+ src.var.storage = refs[i].var.storage;
+ src.var.type = refs[i].var.type;
+
+ src.source.func = new Function(BNNewFunctionReference(refs[i].source.func));
+ src.source.arch = new CoreArchitecture(refs[i].source.arch);
+ src.source.addr = refs[i].source.addr;
+ src.source.type = refs[i].source.type;
+ src.source.exprId = refs[i].source.exprId;
+
+ result.push_back(src);
+ }
+
+ BNFreeVariableReferenceSourceList(refs, count);
+ return result;
+}
+
+
+vector<VariableReferenceSource> Function::GetHighLevelILVariableReferencesInRange(Architecture* arch, uint64_t addr, uint64_t len)
+{
+ size_t count;
+ BNVariableReferenceSource* refs = BNGetHighLevelILVariableReferencesInRange(m_object, arch->GetObject(), addr, len, &count);
+
+ vector<VariableReferenceSource> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ VariableReferenceSource src;
+ src.var.index = refs[i].var.index;
+ src.var.storage = refs[i].var.storage;
+ src.var.type = refs[i].var.type;
+
+ src.source.func = new Function(BNNewFunctionReference(refs[i].source.func));
+ src.source.arch = new CoreArchitecture(refs[i].source.arch);
+ src.source.addr = refs[i].source.addr;
+ src.source.type = refs[i].source.type;
+ src.source.exprId = refs[i].source.exprId;
+
+ result.push_back(src);
+ }
+
+ BNFreeVariableReferenceSourceList(refs, count);
+ return result;
+}
+
+
AdvancedFunctionAnalysisDataRequestor::AdvancedFunctionAnalysisDataRequestor(Function* func): m_func(func)
{
if (m_func)