summaryrefslogtreecommitdiff
path: root/rust/examples
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2024-04-29 19:16:05 -0400
committerGlenn Smith <glenn@vector35.com>2024-06-04 14:37:49 -0400
commit8173715404106919642746094513822041995675 (patch)
tree1c14ec684c8150aa45d98315e15612574088c863 /rust/examples
parent4585954404982498919160349545491853828464 (diff)
PDB: Ignore the formal vtable types (array of void function pointers)
They are conflicting with the demangler-generated real vtable types
Diffstat (limited to 'rust/examples')
-rw-r--r--rust/examples/pdb-ng/src/type_parser.rs37
1 files changed, 29 insertions, 8 deletions
diff --git a/rust/examples/pdb-ng/src/type_parser.rs b/rust/examples/pdb-ng/src/type_parser.rs
index dc23f2ff..f21a04fa 100644
--- a/rust/examples/pdb-ng/src/type_parser.rs
+++ b/rust/examples/pdb-ng/src/type_parser.rs
@@ -487,6 +487,33 @@ impl<'a, S: Source<'a> + 'a> PDBParserInstance<'a, S> {
}
}
+ // Also array of bare function pointers (often seen in vtables)
+ // These should not be marked confidently, as they don't actually know
+ // the types of their contents
+
+ if ty.type_class() == TypeClass::ArrayTypeClass {
+ if let Ok(ptr) = ty.element_type() {
+ if ptr.contents.type_class() == TypeClass::PointerTypeClass {
+ if let Ok(fun) = ptr.contents.target() {
+ if fun.contents.type_class() == TypeClass::FunctionTypeClass
+ && fun
+ .contents
+ .parameters()
+ .map(|pars| pars.len())
+ .unwrap_or(0)
+ == 0
+ {
+ if let Ok(ret) = fun.contents.return_value() {
+ if ret.contents.type_class() == TypeClass::VoidTypeClass {
+ confidence = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
Ok(Some(Conf::new(ty, confidence)))
}
None => Ok(None),
@@ -843,10 +870,7 @@ impl<'a, S: Source<'a> + 'a> PDBParserInstance<'a, S> {
Type::structure(builder.finalize().as_ref()),
max_confidence(),
),
- name: bitfield_name(
- last_bitfield_offset,
- last_bitfield_idx,
- ),
+ name: bitfield_name(last_bitfield_offset, last_bitfield_idx),
offset: last_bitfield_offset,
access: MemberAccess::PublicAccess,
scope: MemberScope::NoScope,
@@ -880,10 +904,7 @@ impl<'a, S: Source<'a> + 'a> PDBParserInstance<'a, S> {
Type::structure(builder.finalize().as_ref()),
max_confidence(),
),
- name: bitfield_name(
- last_bitfield_offset,
- last_bitfield_idx,
- ),
+ name: bitfield_name(last_bitfield_offset, last_bitfield_idx),
offset: last_bitfield_offset,
access: MemberAccess::PublicAccess,
scope: MemberScope::NoScope,