From 53164c16a6aff903c0eb4ed278cd2168c107f298 Mon Sep 17 00:00:00 2001 From: Josh Ferrell Date: Tue, 20 Aug 2024 11:53:49 -0400 Subject: DWARF: Recurse through DW_AT_abstract_origin when resolving types --- rust/examples/dwarf/dwarf_import/src/types.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'rust/examples') diff --git a/rust/examples/dwarf/dwarf_import/src/types.rs b/rust/examples/dwarf/dwarf_import/src/types.rs index 35794e36..19b38a90 100644 --- a/rust/examples/dwarf/dwarf_import/src/types.rs +++ b/rust/examples/dwarf/dwarf_import/src/types.rs @@ -269,6 +269,29 @@ pub(crate) fn get_type( None } } + } else if let Some(die_reference) = get_attr_die( + dwarf, + unit, + entry, + debug_info_builder_context, + constants::DW_AT_abstract_origin, + ) { + // This needs to recurse first (before the early return below) to ensure all sub-types have been parsed + match die_reference { + DieReference::UnitAndOffset((dwarf, entry_unit, entry_offset)) => { + get_type( + dwarf, + entry_unit, + &entry_unit.entry(entry_offset).unwrap(), + debug_info_builder_context, + debug_info_builder, + ) + } + DieReference::Err => { + warn!("Failed to fetch DIE when getting type through DW_AT_abstract_origin. Debug information may be incomplete."); + None + } + } } else { // This needs to recurse first (before the early return below) to ensure all sub-types have been parsed match resolve_specification(dwarf, unit, entry, debug_info_builder_context) { -- cgit v1.3.1