summaryrefslogtreecommitdiff
path: root/type.cpp
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-09-21 21:51:37 -0400
committerMason Reed <mason@vector35.com>2025-10-23 14:29:15 -0400
commitc35849163319ee606a28eb4d8bfd585b1f4eddcf (patch)
treeb6e2269effe50de773aecf71fca3f71801067ead /type.cpp
parent24e66649863d724aa532ff884c6f27c141a0eede (diff)
Support bitfields in type system
Also adds support for parsing bitfields in PDB, DWARF and SVD plugins WIP: API needs to be considered more, also need to find type related apis that may need to be rethought.
Diffstat (limited to 'type.cpp')
-rw-r--r--type.cpp31
1 files changed, 29 insertions, 2 deletions
diff --git a/type.cpp b/type.cpp
index 0625f8e0..17f78840 100644
--- a/type.cpp
+++ b/type.cpp
@@ -2515,6 +2515,8 @@ vector<StructureMember> Structure::GetMembers() const
member.offset = members[i].offset;
member.access = members[i].access;
member.scope = members[i].scope;
+ member.bitPosition = members[i].bitPosition;
+ member.bitWidth = members[i].bitWidth;
result.push_back(member);
}
@@ -2540,6 +2542,8 @@ vector<InheritedStructureMember> Structure::GetMembersIncludingInherited(const T
member.member.offset = members[i].member.offset;
member.member.access = members[i].member.access;
member.member.scope = members[i].member.scope;
+ member.member.bitPosition = members[i].member.bitPosition;
+ member.member.bitWidth = members[i].member.bitWidth;
member.memberIndex = members[i].memberIndex;
result.push_back(member);
}
@@ -2563,6 +2567,8 @@ bool Structure::GetMemberIncludingInheritedAtOffset(BinaryView* view, int64_t of
result.member.offset = member->member.offset;
result.member.access = member->member.access;
result.member.scope = member->member.scope;
+ result.member.bitPosition = member->member.bitPosition;
+ result.member.bitWidth = member->member.bitWidth;
result.memberIndex = member->memberIndex;
BNFreeInheritedStructureMember(member);
@@ -2580,6 +2586,8 @@ bool Structure::GetMemberByName(const string& name, StructureMember& result) con
result.offset = member->offset;
result.access = member->access;
result.scope = member->scope;
+ result.bitPosition = member->bitPosition;
+ result.bitWidth = member->bitWidth;
BNFreeStructureMember(member);
return true;
}
@@ -2604,6 +2612,8 @@ bool Structure::GetMemberAtOffset(int64_t offset, StructureMember& result, size_
result.offset = member->offset;
result.access = member->access;
result.scope = member->scope;
+ result.bitPosition = member->bitPosition;
+ result.bitWidth = member->bitWidth;
BNFreeStructureMember(member);
return true;
}
@@ -2708,6 +2718,8 @@ static void ResolveMemberCallback(void* ctxt, BNNamedTypeReference* baseName, BN
apiMember.offset = member.offset;
apiMember.access = member.access;
apiMember.scope = member.scope;
+ apiMember.bitPosition = member.bitPosition;
+ apiMember.bitWidth = member.bitWidth;
(*resolveFunc->callback)(baseNameRef, resolvedStructRef, memberIndex, structOffset, adjustedOffset, apiMember);
}
@@ -2848,6 +2860,8 @@ vector<StructureMember> StructureBuilder::GetMembers() const
member.offset = members[i].offset;
member.access = members[i].access;
member.scope = members[i].scope;
+ member.bitPosition = members[i].bitPosition;
+ member.bitWidth = members[i].bitWidth;
result.push_back(member);
}
@@ -2866,6 +2880,8 @@ bool StructureBuilder::GetMemberByName(const string& name, StructureMember& resu
result.offset = member->offset;
result.access = member->access;
result.scope = member->scope;
+ result.bitPosition = member->bitPosition;
+ result.bitWidth = member->bitWidth;
BNFreeStructureMember(member);
return true;
}
@@ -2890,6 +2906,8 @@ bool StructureBuilder::GetMemberAtOffset(int64_t offset, StructureMember& result
result.offset = member->offset;
result.access = member->access;
result.scope = member->scope;
+ result.bitPosition = member->bitPosition;
+ result.bitWidth = member->bitWidth;
BNFreeStructureMember(member);
return true;
}
@@ -2993,16 +3011,25 @@ StructureBuilder& StructureBuilder::AddMember(
StructureBuilder& StructureBuilder::AddMemberAtOffset(const Confidence<Ref<Type>>& type, const string& name,
- uint64_t offset, bool overwriteExisting, BNMemberAccess access, BNMemberScope scope)
+ uint64_t offset, bool overwriteExisting, BNMemberAccess access, BNMemberScope scope, uint8_t bitPosition, uint8_t bitWidth)
{
BNTypeWithConfidence tc;
tc.type = type->GetObject();
tc.confidence = type.GetConfidence();
- BNAddStructureBuilderMemberAtOffset(m_object, &tc, name.c_str(), offset, overwriteExisting, access, scope);
+ BNAddStructureBuilderMemberAtOffset(m_object, &tc, name.c_str(), offset, overwriteExisting, access, scope, bitPosition, bitWidth);
return *this;
}
+StructureBuilder& StructureBuilder::AddMemberAtBitOffset(const Confidence<Ref<Type>>& type, const string& name,
+ uint64_t bitOffset, uint8_t bitWidth, bool overwriteExisting, BNMemberAccess access, BNMemberScope scope)
+{
+ const uint64_t byteOffset = bitOffset / 8;
+ const uint8_t bitPosition = bitOffset % 8;
+ return AddMemberAtOffset(type, name, byteOffset, overwriteExisting, access, scope, bitPosition, bitWidth);
+}
+
+
StructureBuilder& StructureBuilder::RemoveMember(size_t idx)
{
BNRemoveStructureBuilderMember(m_object, idx);