diff options
| author | Mason Reed <mason@vector35.com> | 2025-09-21 21:51:37 -0400 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-10-23 14:29:15 -0400 |
| commit | c35849163319ee606a28eb4d8bfd585b1f4eddcf (patch) | |
| tree | b6e2269effe50de773aecf71fca3f71801067ead /plugins/pdb-ng/src/struct_grouper.rs | |
| parent | 24e66649863d724aa532ff884c6f27c141a0eede (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.rs | 87 |
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) => { |
