MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / resolve_specification

Function resolve_specification

plugins/dwarf/dwarf_import/src/helpers.rs:127–177  ·  view source on GitHub ↗
(
    dwarf: &'a Dwarf<R>,
    unit: &'a Unit<R>,
    entry: &DebuggingInformationEntry<R>,
    debug_info_builder_context: &'a DebugInfoBuilderContext<R>,
)

Source from the content-addressed store, hash-verified

125}
126
127pub(crate) fn resolve_specification<'a, R: ReaderType>(
128 dwarf: &'a Dwarf<R>,
129 unit: &'a Unit<R>,
130 entry: &DebuggingInformationEntry<R>,
131 debug_info_builder_context: &'a DebugInfoBuilderContext<R>,
132) -> DieReference<'a, R> {
133 if let Some(die_reference) = get_attr_die(
134 dwarf,
135 unit,
136 entry,
137 debug_info_builder_context,
138 constants::DW_AT_specification,
139 ) {
140 match die_reference {
141 DieReference::UnitAndOffset((dwarf, entry_unit, entry_offset)) => {
142 if let Ok(entry) = entry_unit.entry(entry_offset) {
143 resolve_specification(dwarf, entry_unit, &entry, debug_info_builder_context)
144 } else {
145 warn!("Failed to fetch DIE for attr DW_AT_specification. Debug information may be incomplete.");
146 DieReference::Err
147 }
148 }
149 DieReference::Err => DieReference::Err,
150 }
151 } else if let Some(die_reference) = get_attr_die(
152 dwarf,
153 unit,
154 entry,
155 debug_info_builder_context,
156 constants::DW_AT_abstract_origin,
157 ) {
158 match die_reference {
159 DieReference::UnitAndOffset((dwarf, entry_unit, entry_offset)) => {
160 if entry_offset == entry.offset()
161 && unit.header.offset() == entry_unit.header.offset()
162 {
163 warn!("DWARF information is invalid (infinite abstract origin reference cycle). Debug information may be incomplete.");
164 DieReference::Err
165 } else if let Ok(new_entry) = entry_unit.entry(entry_offset) {
166 resolve_specification(dwarf, entry_unit, &new_entry, debug_info_builder_context)
167 } else {
168 warn!("Failed to fetch DIE for attr DW_AT_abstract_origin. Debug information may be incomplete.");
169 DieReference::Err
170 }
171 }
172 DieReference::Err => DieReference::Err,
173 }
174 } else {
175 DieReference::UnitAndOffset((dwarf, unit, entry.offset()))
176 }
177}
178
179// Get name from DIE, or referenced dependencies
180pub(crate) fn get_name<R: ReaderType>(

Callers 4

get_typeFunction · 0.85
get_nameMethod · 0.85
get_nameFunction · 0.85
get_raw_nameFunction · 0.85

Calls 2

get_attr_dieFunction · 0.85
offsetMethod · 0.45

Tested by

no test coverage detected