summaryrefslogtreecommitdiff
path: root/function.cpp
diff options
context:
space:
mode:
authorGlenn Smith <couleeapps@gmail.com>2019-05-28 13:47:14 -0400
committerGlenn Smith <glenn@vector35.com>2019-08-01 18:36:03 -0400
commit087fdd83b85dd894d5b895557a378bb01828d0ff (patch)
tree8f9846be65885fa97cf934aa2e7dbd22cf150765 /function.cpp
parent9bb1a15b800da0ac5b60c40e3b10321e4efc5a1b (diff)
Tags
Diffstat (limited to 'function.cpp')
-rw-r--r--function.cpp232
1 files changed, 232 insertions, 0 deletions
diff --git a/function.cpp b/function.cpp
index 752d0bd1..0d5cb2ba 100644
--- a/function.cpp
+++ b/function.cpp
@@ -1300,6 +1300,237 @@ void Function::SetUserInstructionHighlight(Architecture* arch, uint64_t addr, ui
}
+std::vector<TagReference> Function::GetAllTagReferences()
+{
+ size_t count;
+ BNTagReference* refs = BNGetFunctionAllTagReferences(m_object, &count);
+ return TagReference::ConvertAndFreeTagReferenceList(refs, count);
+}
+
+
+std::vector<TagReference> Function::GetTagReferencesOfType(Ref<TagType> tagType)
+{
+ size_t count;
+ BNTagReference* refs = BNGetFunctionTagReferencesOfType(m_object, tagType->GetObject(), &count);
+ return TagReference::ConvertAndFreeTagReferenceList(refs, count);
+}
+
+
+std::vector<TagReference> Function::GetAddressTagReferences()
+{
+ size_t count;
+ BNTagReference* refs = BNGetAddressTagReferences(m_object, &count);
+ return TagReference::ConvertAndFreeTagReferenceList(refs, count);
+}
+
+
+std::vector<Ref<Tag>> Function::GetAddressTags(Architecture* arch, uint64_t addr)
+{
+ size_t count;
+ BNTag** tags = BNGetAddressTags(m_object, arch->GetObject(), addr, &count);
+ return Tag::ConvertAndFreeTagList(tags, count);
+}
+
+
+std::vector<Ref<Tag>> Function::GetAddressTagsOfType(Architecture* arch, uint64_t addr, Ref<TagType> tagType)
+{
+ size_t count;
+ BNTag** tags = BNGetAddressTagsOfType(m_object, arch->GetObject(), addr, tagType->GetObject(), &count);
+ return Tag::ConvertAndFreeTagList(tags, count);
+}
+
+
+void Function::AddAutoAddressTag(Architecture* arch, uint64_t addr, Ref<Tag> tag)
+{
+ BNAddAutoAddressTag(m_object, arch->GetObject(), addr, tag->GetObject());
+}
+
+
+void Function::RemoveAutoAddressTag(Architecture* arch, uint64_t addr, Ref<Tag> tag)
+{
+ BNRemoveAutoAddressTag(m_object, arch->GetObject(), addr, tag->GetObject());
+}
+
+
+void Function::AddUserAddressTag(Architecture* arch, uint64_t addr, Ref<Tag> tag)
+{
+ BNAddUserAddressTag(m_object, arch->GetObject(), addr, tag->GetObject());
+}
+
+
+void Function::RemoveUserAddressTag(Architecture* arch, uint64_t addr, Ref<Tag> tag)
+{
+ BNRemoveUserAddressTag(m_object, arch->GetObject(), addr, tag->GetObject());
+}
+
+
+std::vector<TagReference> Function::GetFunctionTagReferences()
+{
+ size_t count;
+ BNTagReference* refs = BNGetFunctionTagReferences(m_object, &count);
+ return TagReference::ConvertAndFreeTagReferenceList(refs, count);
+}
+
+
+std::vector<Ref<Tag>> Function::GetFunctionTags()
+{
+ size_t count;
+ BNTag** tags = BNGetFunctionTags(m_object, &count);
+ return Tag::ConvertAndFreeTagList(tags, count);
+}
+
+
+std::vector<Ref<Tag>> Function::GetFunctionTagsOfType(Ref<TagType> tagType)
+{
+ size_t count;
+ BNTag** tags = BNGetFunctionTagsOfType(m_object, tagType->GetObject(), &count);
+ return Tag::ConvertAndFreeTagList(tags, count);
+}
+
+
+void Function::AddAutoFunctionTag(Ref<Tag> tag)
+{
+ BNAddAutoFunctionTag(m_object, tag->GetObject());
+}
+
+
+void Function::RemoveAutoFunctionTag(Ref<Tag> tag)
+{
+ BNRemoveAutoFunctionTag(m_object, tag->GetObject());
+}
+
+
+void Function::AddUserFunctionTag(Ref<Tag> tag)
+{
+ BNAddUserFunctionTag(m_object, tag->GetObject());
+}
+
+
+void Function::RemoveUserFunctionTag(Ref<Tag> tag)
+{
+ BNRemoveUserFunctionTag(m_object, tag->GetObject());
+}
+
+
+Ref<Tag> Function::CreateAutoAddressTag(Architecture* arch, uint64_t addr, const std::string& tagTypeName, const std::string& data, bool unique)
+{
+ Ref<TagType> tagType = GetView()->GetTagType(tagTypeName);
+ if (!tagType)
+ return nullptr;
+
+ return CreateAutoAddressTag(arch, addr, tagType, data, unique);
+}
+
+
+Ref<Tag> Function::CreateAutoAddressTag(Architecture* arch, uint64_t addr, Ref<TagType> tagType, const std::string& data, bool unique)
+{
+ if (unique)
+ {
+ auto tags = GetAddressTags(arch, addr);
+ for (const auto& tag : tags)
+ {
+ if (tag->GetType() == tagType && tag->GetData() == data)
+ return nullptr;
+ }
+ }
+
+ Ref<Tag> tag = new Tag(tagType, data);
+ GetView()->AddTag(tag);
+
+ AddAutoAddressTag(arch, addr, tag);
+ return tag;
+}
+
+
+Ref<Tag> Function::CreateUserAddressTag(Architecture* arch, uint64_t addr, const std::string& tagTypeName, const std::string& data, bool unique)
+{
+ Ref<TagType> tagType = GetView()->GetTagType(tagTypeName);
+ if (!tagType)
+ return nullptr;
+
+ return CreateUserAddressTag(arch, addr, tagType, data, unique);
+}
+
+
+Ref<Tag> Function::CreateUserAddressTag(Architecture* arch, uint64_t addr, Ref<TagType> tagType, const std::string& data, bool unique)
+{
+ if (unique)
+ {
+ auto tags = GetAddressTags(arch, addr);
+ for (const auto& tag : tags)
+ {
+ if (tag->GetType() == tagType && tag->GetData() == data)
+ return nullptr;
+ }
+ }
+ Ref<Tag> tag = new Tag(tagType, data);
+ GetView()->AddTag(tag);
+
+ AddUserAddressTag(arch, addr, tag);
+ return tag;
+}
+
+
+Ref<Tag> Function::CreateAutoFunctionTag(const std::string& tagTypeName, const std::string& data, bool unique)
+{
+ Ref<TagType> tagType = GetView()->GetTagType(tagTypeName);
+ if (!tagType)
+ return nullptr;
+
+ return CreateAutoFunctionTag(tagType, data, unique);
+}
+
+
+Ref<Tag> Function::CreateAutoFunctionTag(Ref<TagType> tagType, const std::string& data, bool unique)
+{
+ if (unique)
+ {
+ auto tags = GetFunctionTags();
+ for (const auto& tag : tags)
+ {
+ if (tag->GetType() == tagType && tag->GetData() == data)
+ return nullptr;
+ }
+ }
+
+ Ref<Tag> tag = new Tag(tagType, data);
+ GetView()->AddTag(tag);
+
+ AddAutoFunctionTag(tag);
+ return tag;
+}
+
+
+Ref<Tag> Function::CreateUserFunctionTag(const std::string& tagTypeName, const std::string& data, bool unique)
+{
+ Ref<TagType> tagType = GetView()->GetTagType(tagTypeName);
+ if (!tagType)
+ return nullptr;
+
+ return CreateUserFunctionTag(tagType, data, unique);
+}
+
+
+Ref<Tag> Function::CreateUserFunctionTag(Ref<TagType> tagType, const std::string& data, bool unique)
+{
+ if (unique)
+ {
+ auto tags = GetFunctionTags();
+ for (const auto& tag : tags)
+ {
+ if (tag->GetType() == tagType && tag->GetData() == data)
+ return nullptr;
+ }
+ }
+
+ Ref<Tag> tag = new Tag(tagType, data);
+ GetView()->AddTag(tag);
+
+ AddUserFunctionTag(tag);
+ return tag;
+}
+
+
Confidence<RegisterValue> Function::GetGlobalPointerValue() const
{
BNRegisterValueWithConfidence value = BNGetFunctionGlobalPointerValue(m_object);
@@ -1370,6 +1601,7 @@ vector<DisassemblyTextLine> Function::GetTypeTokens(DisassemblySettings* setting
line.instrIndex = lines[i].instrIndex;
line.highlight = lines[i].highlight;
line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(lines[i].tokens, lines[i].count);
+ line.tags = Tag::ConvertTagList(lines[i].tags, lines[i].tagCount);
result.push_back(line);
}