summaryrefslogtreecommitdiff
path: root/plugins/dwarf/dwarf_export
diff options
context:
space:
mode:
authorScott Lagler <laglerscott@gmail.com>2025-02-23 13:45:29 -0500
committerMason Reed <mason@vector35.com>2025-02-28 23:44:45 -0500
commitd5d34cf691dc7fd0cc4580ed4a30e8c38c5dc51f (patch)
tree53fa416664858f0ece28c18ad3d3c7b56942dd2c /plugins/dwarf/dwarf_export
parent88aeaf3e2219c7cb7da00e0be891172e0de680c8 (diff)
Handle base structures in DWARF export
Diffstat (limited to 'plugins/dwarf/dwarf_export')
-rw-r--r--plugins/dwarf/dwarf_export/src/lib.rs29
1 files changed, 27 insertions, 2 deletions
diff --git a/plugins/dwarf/dwarf_export/src/lib.rs b/plugins/dwarf/dwarf_export/src/lib.rs
index 26be0434..bac96729 100644
--- a/plugins/dwarf/dwarf_export/src/lib.rs
+++ b/plugins/dwarf/dwarf_export/src/lib.rs
@@ -109,7 +109,8 @@ fn export_type(
Some(float_die_uid)
}
TypeClass::StructureTypeClass => {
- let structure_die_uid = match t.get_structure().unwrap().structure_type() {
+ let ty_struct = t.get_structure().unwrap();
+ let structure_die_uid = match ty_struct.structure_type() {
StructureType::ClassStructureType => {
dwarf.unit.add(root, constants::DW_TAG_class_type)
}
@@ -122,6 +123,30 @@ fn export_type(
};
defined_types.push((t.to_owned(), structure_die_uid));
+ for base_struct in ty_struct.base_structures() {
+ let inheritance_uid = dwarf.unit.add(structure_die_uid, gimli::DW_TAG_inheritance);
+ let base_struct_uid = export_type(
+ base_struct.ty.name().to_string(),
+ base_struct.ty.target(bv).unwrap().as_ref(),
+ bv,
+ defined_types,
+ dwarf,
+ )
+ .unwrap();
+ dwarf
+ .unit
+ .get_mut(inheritance_uid)
+ .set(gimli::DW_AT_type, AttributeValue::UnitRef(base_struct_uid));
+ dwarf.unit.get_mut(inheritance_uid).set(
+ gimli::DW_AT_data_member_location,
+ AttributeValue::Data8(base_struct.offset),
+ );
+ dwarf.unit.get_mut(inheritance_uid).set(
+ gimli::DW_AT_accessibility,
+ AttributeValue::Accessibility(gimli::DW_ACCESS_public),
+ );
+ }
+
dwarf.unit.get_mut(structure_die_uid).set(
gimli::DW_AT_name,
AttributeValue::String(name.as_bytes().to_vec()),
@@ -131,7 +156,7 @@ fn export_type(
AttributeValue::Data2(t.width() as u16),
);
- for struct_member in t.get_structure().unwrap().members() {
+ for struct_member in ty_struct.members() {
let struct_member_die_uid =
dwarf.unit.add(structure_die_uid, constants::DW_TAG_member);
dwarf.unit.get_mut(struct_member_die_uid).set(