Path: blob/main/crates/cranelift/src/debug/gc.rs
3079 views
use crate::debug::Reader;1use crate::debug::transform::AddressTransform;2use gimli::constants;3use gimli::read;4use gimli::write;56pub fn build_dependencies(7filter: &mut write::FilterUnitSection<'_, Reader<'_>>,8at: &AddressTransform,9) -> write::ConvertResult<()> {10while let Some(mut unit) = filter.read_unit()? {11build_die_dependencies(&mut unit, at)?;12}13Ok(())14}1516fn has_valid_code_range(17die: &write::FilterUnitEntry<'_, Reader<'_>>,18at: &AddressTransform,19) -> read::Result<bool> {20let unit = die.read_unit;21match die.tag {22constants::DW_TAG_subprogram => {23if let Some(ranges_attr) = die.attr_value(constants::DW_AT_ranges) {24let offset = match ranges_attr {25read::AttributeValue::RangeListsRef(val) => unit.ranges_offset_from_raw(val),26read::AttributeValue::DebugRngListsIndex(index) => unit.ranges_offset(index)?,27_ => return Ok(false),28};29let mut has_valid_base = if let Some(read::AttributeValue::Addr(low_pc)) =30die.attr_value(constants::DW_AT_low_pc)31{32Some(at.can_translate_address(low_pc))33} else {34None35};36let mut it = unit.raw_ranges(offset)?;37while let Some(range) = it.next()? {38// If at least one of the range addresses can be converted,39// declaring code range as valid.40match range {41read::RawRngListEntry::AddressOrOffsetPair { .. }42if has_valid_base.is_some() =>43{44if has_valid_base.unwrap() {45return Ok(true);46}47}48read::RawRngListEntry::StartEnd { begin, .. }49| read::RawRngListEntry::StartLength { begin, .. }50| read::RawRngListEntry::AddressOrOffsetPair { begin, .. } => {51if at.can_translate_address(begin) {52return Ok(true);53}54}55read::RawRngListEntry::StartxEndx { begin, .. }56| read::RawRngListEntry::StartxLength { begin, .. } => {57let addr = unit.address(begin)?;58if at.can_translate_address(addr) {59return Ok(true);60}61}62read::RawRngListEntry::BaseAddress { addr } => {63has_valid_base = Some(at.can_translate_address(addr));64}65read::RawRngListEntry::BaseAddressx { addr } => {66let addr = unit.address(addr)?;67has_valid_base = Some(at.can_translate_address(addr));68}69read::RawRngListEntry::OffsetPair { .. } => (),70}71}72return Ok(false);73} else if let Some(low_pc) = die.attr_value(constants::DW_AT_low_pc) {74if let read::AttributeValue::Addr(a) = low_pc {75return Ok(at.can_translate_address(a));76} else if let read::AttributeValue::DebugAddrIndex(i) = low_pc {77let a = unit.address(i)?;78return Ok(at.can_translate_address(a));79}80}81}82_ => (),83}84Ok(false)85}8687fn build_die_dependencies(88unit: &mut write::FilterUnit<'_, Reader<'_>>,89at: &AddressTransform,90) -> write::ConvertResult<()> {91let mut die = write::FilterUnitEntry::null(unit.read_unit);92while unit.read_entry(&mut die)? {93if has_valid_code_range(&die, at)? {94unit.require_entry(die.offset);95}96}97Ok(())98}99100101