summaryrefslogtreecommitdiff
path: root/plugins/pdb-ng/src/struct_grouper.rs
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 /plugins/pdb-ng/src/struct_grouper.rs
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 'plugins/pdb-ng/src/struct_grouper.rs')
-rw-r--r--plugins/pdb-ng/src/struct_grouper.rs87
1 files changed, 59 insertions, 28 deletions
diff --git a/plugins/pdb-ng/src/struct_grouper.rs b/plugins/pdb-ng/src/struct_grouper.rs
index ff911afd..fcaf88ef 100644
--- a/plugins/pdb-ng/src/struct_grouper.rs
+++ b/plugins/pdb-ng/src/struct_grouper.rs
@@ -340,8 +340,10 @@ pub fn group_structure(
.enumerate()
.map(|(i, member)| MemberSize {
index: i,
- offset: member.offset,
- width: member.ty.contents.width(),
+ offset: member.bitfield_position.unwrap_or(member.offset * 8),
+ width: member
+ .bitfield_size
+ .unwrap_or(member.ty.contents.width() * 8),
})
.collect::<Vec<_>>();
@@ -359,14 +361,29 @@ pub fn group_structure(
Err(e) => {
warn!("{} Could not resolve structure groups: {}", name, e);
for member in members {
- structure.insert(
- &member.ty,
- &member.name,
- member.offset,
- false,
- member.access,
- member.scope,
- );
+ match (member.bitfield_position, member.bitfield_size) {
+ (Some(bit_pos), bit_width) => {
+ structure.insert_bitwise(
+ &member.ty,
+ &member.name,
+ bit_pos,
+ bit_width.map(|w| w as u8),
+ false,
+ member.access,
+ member.scope,
+ );
+ }
+ (None, _) => {
+ structure.insert(
+ &member.ty,
+ &member.name,
+ member.offset,
+ false,
+ member.access,
+ member.scope,
+ );
+ }
+ }
}
}
}
@@ -387,24 +404,38 @@ fn apply_groups(
// TODO : Fix inner-offset being larger than `member.offset`
- if offset > member.offset {
- structure.insert(
- &member.ty,
- &member.name,
- 0,
- false,
- member.access,
- member.scope,
- );
- } else {
- structure.insert(
- &member.ty,
- &member.name,
- member.offset - offset,
- false,
- member.access,
- member.scope,
- );
+ match (member.bitfield_position, member.bitfield_size) {
+ (Some(bit_pos), bit_width) => {
+ structure.insert_bitwise(
+ &member.ty,
+ &member.name,
+ bit_pos,
+ bit_width.map(|w| w as u8),
+ false,
+ member.access,
+ member.scope,
+ );
+ }
+ (None, _) if offset > member.offset => {
+ structure.insert(
+ &member.ty,
+ &member.name,
+ 0,
+ false,
+ member.access,
+ member.scope,
+ );
+ }
+ (None, _) => {
+ structure.insert(
+ &member.ty,
+ &member.name,
+ member.offset - offset,
+ false,
+ member.access,
+ member.scope,
+ );
+ }
}
}
ResolvedGroup::Struct(inner_offset, children) => {