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