1 use super::address_transform::AddressTransform; 2 use super::expression::{CompiledExpression, FunctionFrameInfo}; 3 use anyhow::Error; 4 use cranelift_codegen::isa::TargetIsa; 5 use gimli::write; 6 7 pub(crate) fn append_vmctx_info( 8 comp_unit: &mut write::Unit, 9 parent_id: write::UnitEntryId, 10 vmctx_ptr_die_ref: write::Reference, 11 addr_tr: &AddressTransform, 12 frame_info: Option<&FunctionFrameInfo>, 13 scope_ranges: &[(u64, u64)], 14 out_strings: &mut write::StringTable, 15 isa: &dyn TargetIsa, 16 ) -> Result<(), Error> { 17 let loc = { 18 let expr = CompiledExpression::vmctx(); 19 let locs = expr 20 .build_with_locals(scope_ranges, addr_tr, frame_info, isa) 21 .map(|i| { 22 i.map(|(begin, length, data)| write::Location::StartLength { 23 begin, 24 length, 25 data, 26 }) 27 }) 28 .collect::<Result<Vec<_>, _>>()?; 29 let list_id = comp_unit.locations.add(write::LocationList(locs)); 30 write::AttributeValue::LocationListRef(list_id) 31 }; 32 33 let var_die_id = comp_unit.add(parent_id, gimli::DW_TAG_variable); 34 let var_die = comp_unit.get_mut(var_die_id); 35 var_die.set( 36 gimli::DW_AT_name, 37 write::AttributeValue::StringRef(out_strings.add("__vmctx")), 38 ); 39 var_die.set( 40 gimli::DW_AT_type, 41 write::AttributeValue::DebugInfoRef(vmctx_ptr_die_ref), 42 ); 43 var_die.set(gimli::DW_AT_location, loc); 44 45 Ok(()) 46 } 47