10b2c9d72SSingleAccretion use crate::debug::Reader;
20b2c9d72SSingleAccretion
387c33c29SAlex Crichton use super::address_transform::AddressTransform;
487c33c29SAlex Crichton use super::expression::{CompiledExpression, FunctionFrameInfo};
587c33c29SAlex Crichton use cranelift_codegen::isa::TargetIsa;
6*c4a38d67SPhilip Craig use gimli::{AttributeValue, UnitRef, write};
7c7cab275SNick Fitzgerald use wasmtime_environ::error::Error;
887c33c29SAlex Crichton
append_vmctx_info( comp_unit: &mut write::Unit, parent_id: write::UnitEntryId, vmctx_ptr_die_ref: write::DebugInfoRef, addr_tr: &AddressTransform, frame_info: Option<&FunctionFrameInfo>, scope_ranges: &[(u64, u64)], out_strings: &mut write::StringTable, isa: &dyn TargetIsa, ) -> Result<(), Error>987c33c29SAlex Crichton pub(crate) fn append_vmctx_info(
1087c33c29SAlex Crichton comp_unit: &mut write::Unit,
1187c33c29SAlex Crichton parent_id: write::UnitEntryId,
127ee620a5SPhilip Craig vmctx_ptr_die_ref: write::DebugInfoRef,
1387c33c29SAlex Crichton addr_tr: &AddressTransform,
1487c33c29SAlex Crichton frame_info: Option<&FunctionFrameInfo>,
1587c33c29SAlex Crichton scope_ranges: &[(u64, u64)],
1687c33c29SAlex Crichton out_strings: &mut write::StringTable,
1787c33c29SAlex Crichton isa: &dyn TargetIsa,
1887c33c29SAlex Crichton ) -> Result<(), Error> {
1987c33c29SAlex Crichton let loc = {
2087c33c29SAlex Crichton let expr = CompiledExpression::vmctx();
2187c33c29SAlex Crichton let locs = expr
2287c33c29SAlex Crichton .build_with_locals(scope_ranges, addr_tr, frame_info, isa)
23d2c9d2a2SSingleAccretion .expressions
2487c33c29SAlex Crichton .map(|i| {
2587c33c29SAlex Crichton i.map(|(begin, length, data)| write::Location::StartLength {
2687c33c29SAlex Crichton begin,
2787c33c29SAlex Crichton length,
2887c33c29SAlex Crichton data,
2987c33c29SAlex Crichton })
3087c33c29SAlex Crichton })
3187c33c29SAlex Crichton .collect::<Result<Vec<_>, _>>()?;
3287c33c29SAlex Crichton let list_id = comp_unit.locations.add(write::LocationList(locs));
3387c33c29SAlex Crichton write::AttributeValue::LocationListRef(list_id)
3487c33c29SAlex Crichton };
3587c33c29SAlex Crichton
3687c33c29SAlex Crichton let var_die_id = comp_unit.add(parent_id, gimli::DW_TAG_variable);
3787c33c29SAlex Crichton let var_die = comp_unit.get_mut(var_die_id);
3887c33c29SAlex Crichton var_die.set(
3987c33c29SAlex Crichton gimli::DW_AT_name,
4087c33c29SAlex Crichton write::AttributeValue::StringRef(out_strings.add("__vmctx")),
4187c33c29SAlex Crichton );
4287c33c29SAlex Crichton var_die.set(
4387c33c29SAlex Crichton gimli::DW_AT_type,
44af476a51SSingleAccretion write::AttributeValue::DebugInfoRef(vmctx_ptr_die_ref),
4587c33c29SAlex Crichton );
4687c33c29SAlex Crichton var_die.set(gimli::DW_AT_location, loc);
4787c33c29SAlex Crichton
4887c33c29SAlex Crichton Ok(())
4987c33c29SAlex Crichton }
500b2c9d72SSingleAccretion
resolve_die_ref<'a, 'r>( unit: UnitRef<'a, Reader<'r>>, die_ref: &AttributeValue<Reader<'r>>, ) -> Result<Option<write::ConvertUnitEntry<'a, Reader<'r>>>, Error>51bd7b59daSPhilip Craig pub fn resolve_die_ref<'a, 'r>(
52bd7b59daSPhilip Craig unit: UnitRef<'a, Reader<'r>>,
53*c4a38d67SPhilip Craig die_ref: &AttributeValue<Reader<'r>>,
54*c4a38d67SPhilip Craig ) -> Result<Option<write::ConvertUnitEntry<'a, Reader<'r>>>, Error> {
550b2c9d72SSingleAccretion let die = match die_ref {
56*c4a38d67SPhilip Craig AttributeValue::UnitRef(unit_offs) => {
57*c4a38d67SPhilip Craig Some(write::ConvertUnitEntry::read(unit, *unit_offs)?)
58*c4a38d67SPhilip Craig }
590b2c9d72SSingleAccretion // TODO-DebugInfo: support AttributeValue::DebugInfoRef. The trouble is that we don't have
600b2c9d72SSingleAccretion // a fast way to go from a DI offset to a unit offset (which is needed to parse the DIE).
610b2c9d72SSingleAccretion // We would likely need to maintain a cache.
620b2c9d72SSingleAccretion _ => None,
630b2c9d72SSingleAccretion };
640b2c9d72SSingleAccretion Ok(die)
650b2c9d72SSingleAccretion }
66