diff options
| author | Scott Lagler <laglerscott@gmail.com> | 2025-02-23 13:45:29 -0500 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-02-28 23:44:45 -0500 |
| commit | d5d34cf691dc7fd0cc4580ed4a30e8c38c5dc51f (patch) | |
| tree | 53fa416664858f0ece28c18ad3d3c7b56942dd2c /plugins/dwarf/dwarf_export | |
| parent | 88aeaf3e2219c7cb7da00e0be891172e0de680c8 (diff) | |
Handle base structures in DWARF export
Diffstat (limited to 'plugins/dwarf/dwarf_export')
| -rw-r--r-- | plugins/dwarf/dwarf_export/src/lib.rs | 29 |
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( |
