From c35849163319ee606a28eb4d8bfd585b1f4eddcf Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Sun, 21 Sep 2025 21:51:37 -0400 Subject: 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. --- type.cpp | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'type.cpp') diff --git a/type.cpp b/type.cpp index 0625f8e0..17f78840 100644 --- a/type.cpp +++ b/type.cpp @@ -2515,6 +2515,8 @@ vector 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 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 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>& 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>& 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); -- cgit v1.3.1