From fb4f4cd30072083bd96a7f3bd2d89f01ad0ba8a1 Mon Sep 17 00:00:00 2001 From: yowl Date: Wed, 24 Apr 2024 09:23:08 -0500 Subject: [PATCH] Add initial support for DWARF Fission (#8055) * add cloning for String attributes * use into_owned instead of to_vec to avoid a clone if possible. * runs, but does not substitute * show vars from c program, start cleanup * tiday * resolve conflicts * remove WASI folder * Add module_builder add dwarf_package to state for cache * move dwarf loading to module_environ.rs pass the dwarf as binary as low as module_environ.rs * pass dwarf package rather than add to debug_info * tidy option/result nested if * revert some toml and whitespace. * add features cranelift,winch to module_builder and compute_artifacts remove some `use`s * address some feedback remove unused 'use's * address some feedback remove unused 'use's * move wat feature condition to cover whole method. * More feedback Another try at wat feature move * Another try at wat feature move * change gimli exemption version add typed-arena exemption * add None for c-api * move `use` to #cfg * fix another config build * revert unwanted code deletion * move inner function closer to use * revert extra param to Module::new * workaround object crate bug. * add missing parameter * add missing parameter * Merge remote-tracking branch 'origin/main' into dwarf-att-string # Conflicts: # crates/wasmtime/src/engine.rs # crates/wasmtime/src/runtime/module.rs # src/common.rs * remove moduke * use common gimli version of 28.1 * remove wasm feature, revert gimli version * remove use of object for wasm dwarf * remove NativeFile workaround, add feature for dwp loading * sync winch signature * revert bench api change * add dwarf for no cache feature * put back merge loss of module kind * remove param from docs * add dwarf fission lldb test * simplify and include test source * clang-format * address feedback, remove packages add docs simplify return type * remove Default use on ModuleTypesBuilder * Remove an `unwrap()` and use `if let` instead * Use `&[u8]` instead of `&Vec` * Remove an `unwrap()` and return `None` instead * Clean up some code in `transform_dwarf` * Clean up some code in `replace_unit_from_split_dwarf` * Clean up some code in `split_unit` * Minor refactorings and documentation in `CodeBuilder` * Restrict visibility of `dwarf_package_binary` * Revert supply-chain folder changes * Fix compile error on nightly * prtest:full * prtest:full * prtest:full * prtest:full * prtest:full * prtest:full * prtest:full * prtest:full * use lldb 15 * prtest:full * prtest:full * load dwp when loading wasm bytes with path * correct source file name * remove debug --------- Co-authored-by: Alex Crichton --- .github/workflows/main.yml | 6 +- crates/cranelift/src/compiler.rs | 4 + crates/cranelift/src/debug/gc.rs | 15 +- crates/cranelift/src/debug/transform/attr.rs | 49 ++---- .../src/debug/transform/line_program.rs | 53 +++--- crates/cranelift/src/debug/transform/mod.rs | 156 ++++++++++++++++-- crates/cranelift/src/debug/transform/unit.rs | 53 +++--- crates/cranelift/src/debug/write_debuginfo.rs | 11 +- crates/environ/src/compile/mod.rs | 2 + .../environ/src/compile/module_artifacts.rs | 42 +++-- crates/environ/src/module_environ.rs | 17 +- crates/wasmtime/src/compile.rs | 16 +- crates/wasmtime/src/compile/code_builder.rs | 78 ++++++++- crates/wasmtime/src/compile/runtime.rs | 18 +- crates/wasmtime/src/runtime/module.rs | 1 - crates/winch/src/compiler.rs | 2 + tests/all/debug/lldb.rs | 48 ++++++ tests/all/debug/testsuite/dwarf_fission.c | 7 + tests/all/debug/testsuite/dwarf_fission.dwp | Bin 0 -> 652 bytes tests/all/debug/testsuite/dwarf_fission.wasm | Bin 0 -> 142353 bytes 20 files changed, 448 insertions(+), 130 deletions(-) create mode 100644 tests/all/debug/testsuite/dwarf_fission.c create mode 100644 tests/all/debug/testsuite/dwarf_fission.dwp create mode 100644 tests/all/debug/testsuite/dwarf_fission.wasm diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7a9bb6fba8..aa5140a06a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -635,11 +635,15 @@ jobs: # Test debug (DWARF) related functionality. - run: | - sudo apt-get update && sudo apt-get install -y gdb lldb llvm + sudo apt-get update && sudo apt-get install -y gdb lldb-15 llvm + # woraround for https://bugs.launchpad.net/ubuntu/+source/llvm-defaults/+bug/1972855 + sudo mkdir -p /usr/lib/local/lib/python3.10/dist-packages/lldb + sudo ln -s /usr/lib/llvm-15/lib/python3.10/dist-packages/lldb/* /usr/lib/python3/dist-packages/lldb/ cargo test test_debug_dwarf -- --ignored --test-threads 1 if: matrix.os == 'ubuntu-latest' && matrix.target == ''&& needs.determine.outputs.run-full env: RUST_BACKTRACE: 1 + LLDB: lldb-15 # override default version, 14 # NB: the test job here is explicitly lacking in cancellation of this run if # something goes wrong. These take the longest anyway and otherwise if diff --git a/crates/cranelift/src/compiler.rs b/crates/cranelift/src/compiler.rs index dc247b4eba..97f7b24100 100644 --- a/crates/cranelift/src/compiler.rs +++ b/crates/cranelift/src/compiler.rs @@ -536,6 +536,8 @@ impl wasmtime_environ::Compiler for Compiler { obj: &mut Object<'_>, translation: &ModuleTranslation<'_>, funcs: &PrimaryMap, + dwarf_package_bytes: Option<&[u8]>, + tunables: &Tunables, ) -> Result<()> { let ofs = VMOffsets::new( self.isa @@ -578,6 +580,8 @@ impl wasmtime_environ::Compiler for Compiler { &translation.debuginfo, &functions_info, &memory_offset, + dwarf_package_bytes, + tunables, ) .with_context(|| "failed to emit DWARF debug information")?; diff --git a/crates/cranelift/src/debug/gc.rs b/crates/cranelift/src/debug/gc.rs index ad8c25d8b8..c6398fb822 100644 --- a/crates/cranelift/src/debug/gc.rs +++ b/crates/cranelift/src/debug/gc.rs @@ -67,12 +67,13 @@ impl Dependencies { pub fn build_dependencies>( dwarf: &read::Dwarf, + dwp: &Option>, at: &AddressTransform, ) -> read::Result { let mut deps = Dependencies::new(); let mut units = dwarf.units(); while let Some(unit) = units.next()? { - build_unit_dependencies(unit, dwarf, at, &mut deps)?; + build_unit_dependencies(unit, dwarf, dwp, at, &mut deps)?; } Ok(deps) } @@ -80,6 +81,7 @@ pub fn build_dependencies>( fn build_unit_dependencies>( header: read::UnitHeader, dwarf: &read::Dwarf, + dwp: &Option>, at: &AddressTransform, deps: &mut Dependencies, ) -> read::Result<()> { @@ -87,6 +89,17 @@ fn build_unit_dependencies>( let mut tree = unit.entries_tree(None)?; let root = tree.root()?; build_die_dependencies(root, dwarf, &unit, at, deps)?; + + if let Some(dwarf_package) = dwp { + if let Some(dwo_id) = unit.dwo_id { + if let Some(cu) = dwarf_package.find_cu(dwo_id, dwarf)? { + if let Some(unit_header) = cu.debug_info.units().next()? { + build_unit_dependencies(unit_header, &cu, &None, at, deps)?; + } + } + } + } + Ok(()) } diff --git a/crates/cranelift/src/debug/transform/attr.rs b/crates/cranelift/src/debug/transform/attr.rs index 354bcdacef..543b24a519 100644 --- a/crates/cranelift/src/debug/transform/attr.rs +++ b/crates/cranelift/src/debug/transform/attr.rs @@ -5,10 +5,7 @@ use super::refs::{PendingDebugInfoRefs, PendingUnitRefs}; use super::{DebugInputContext, Reader, TransformError}; use anyhow::{bail, Error}; use cranelift_codegen::isa::TargetIsa; -use gimli::{ - write, AttributeValue, DebugLineOffset, DebugLineStr, DebugStr, DebugStrOffsets, - DebuggingInformationEntry, Unit, -}; +use gimli::{write, AttributeValue, DebugLineOffset, DebuggingInformationEntry, Unit}; #[derive(Debug)] pub(crate) enum FileAttributeContext<'a> { @@ -124,17 +121,11 @@ where return Err(TransformError("unexpected file index attribute").into()); } } - AttributeValue::DebugStrRef(str_offset) => { - let s = context.debug_str.get_str(str_offset)?.to_slice()?.to_vec(); - write::AttributeValue::StringRef(out_strings.add(s)) - } - AttributeValue::DebugStrOffsetsIndex(i) => { - let str_offset = context.debug_str_offsets.get_str_offset( - gimli::Format::Dwarf32, - unit.str_offsets_base, - i, - )?; - let s = context.debug_str.get_str(str_offset)?.to_slice()?.to_vec(); + AttributeValue::DebugStrRef(_) | AttributeValue::DebugStrOffsetsIndex(_) => { + let s = dwarf + .attr_string(unit, attr.value().clone())? + .to_string_lossy()? + .into_owned(); write::AttributeValue::StringRef(out_strings.add(s)) } AttributeValue::RangeListsRef(r) => { @@ -308,38 +299,22 @@ pub(crate) fn clone_attr_string( attr_value: &AttributeValue, form: gimli::DwForm, unit: &Unit, - debug_str: &DebugStr, - debug_str_offsets: &DebugStrOffsets, - debug_line_str: &DebugLineStr, + dwarf: &gimli::Dwarf, out_strings: &mut write::StringTable, ) -> Result where R: Reader, { - let content = match attr_value { - AttributeValue::DebugStrRef(str_offset) => { - debug_str.get_str(*str_offset)?.to_slice()?.to_vec() - } - AttributeValue::DebugStrOffsetsIndex(i) => { - let str_offset = debug_str_offsets.get_str_offset( - gimli::Format::Dwarf32, - unit.str_offsets_base, - *i, - )?; - debug_str.get_str(str_offset)?.to_slice()?.to_vec() - } - AttributeValue::DebugLineStrRef(str_offset) => { - debug_line_str.get_str(*str_offset)?.to_slice()?.to_vec() - } - AttributeValue::String(b) => b.to_slice()?.to_vec(), - v => bail!("Unexpected attribute value: {:?}", v), - }; + let content = dwarf + .attr_string(unit, attr_value.clone())? + .to_string_lossy()? + .into_owned(); Ok(match form { gimli::DW_FORM_strp => { let id = out_strings.add(content); write::LineString::StringRef(id) } - gimli::DW_FORM_string => write::LineString::String(content), + gimli::DW_FORM_string => write::LineString::String(content.into()), _ => bail!("DW_FORM_line_strp or other not supported"), }) } diff --git a/crates/cranelift/src/debug/transform/line_program.rs b/crates/cranelift/src/debug/transform/line_program.rs index 8eb068e10f..148fe80f3b 100644 --- a/crates/cranelift/src/debug/transform/line_program.rs +++ b/crates/cranelift/src/debug/transform/line_program.rs @@ -3,7 +3,7 @@ use super::attr::clone_attr_string; use super::{Reader, TransformError}; use anyhow::{Context, Error}; use gimli::{ - write, DebugLine, DebugLineOffset, DebugLineStr, DebugStr, DebugStrOffsets, + write, AttributeValue::DebugLineRef, DebugLine, DebugLineOffset, DebugStr, DebuggingInformationEntry, LineEncoding, Unit, }; use wasmtime_environ::{DefinedFuncIndex, EntityRef}; @@ -40,48 +40,57 @@ enum ReadLineProgramState { } pub(crate) fn clone_line_program( + dwarf: &gimli::Dwarf, + skeleton_dwarf: &gimli::Dwarf, unit: &Unit, root: &DebuggingInformationEntry, + skeleton_die: Option<&DebuggingInformationEntry>, addr_tr: &AddressTransform, out_encoding: gimli::Encoding, debug_str: &DebugStr, - debug_str_offsets: &DebugStrOffsets, - debug_line_str: &DebugLineStr, debug_line: &DebugLine, out_strings: &mut write::StringTable, ) -> Result<(write::LineProgram, DebugLineOffset, Vec, u64), Error> where R: Reader, { - let offset = match root.attr_value(gimli::DW_AT_stmt_list)? { - Some(gimli::AttributeValue::DebugLineRef(offset)) => offset, + // Where are the "location" attributes + let (location_die, location_dwarf) = match skeleton_die { + Some(die) => (die, skeleton_dwarf), + _ => (root, dwarf), + }; + + let offset = match location_die.attr_value(gimli::DW_AT_stmt_list)? { + Some(DebugLineRef(offset)) => offset, + Some(gimli::AttributeValue::SecOffset(offset)) => DebugLineOffset(offset), _ => { return Err(TransformError("Debug line offset is not found").into()); } }; - let comp_dir = root.attr_value(gimli::DW_AT_comp_dir)?; + let comp_dir = location_die.attr_value(gimli::DW_AT_comp_dir)?; let comp_name = root.attr_value(gimli::DW_AT_name)?; let out_comp_dir = match &comp_dir { Some(comp_dir) => Some(clone_attr_string( comp_dir, gimli::DW_FORM_strp, unit, - debug_str, - debug_str_offsets, - debug_line_str, + location_dwarf, out_strings, )?), None => None, }; - let out_comp_name = clone_attr_string( - comp_name.as_ref().context("missing DW_AT_name attribute")?, - gimli::DW_FORM_strp, - unit, - debug_str, - debug_str_offsets, - debug_line_str, - out_strings, - )?; + let out_comp_name = match comp_name { + Some(_) => clone_attr_string( + comp_name + .as_ref() + .context("failed to read DW_AT_name attribute")?, + gimli::DW_FORM_strp, + unit, + dwarf, + out_strings, + )?, + _ => gimli::write::LineString::String("missing DW_AT_name attribute".into()), + }; let program = debug_line.program( offset, @@ -114,9 +123,7 @@ where dir_attr, gimli::DW_FORM_string, unit, - debug_str, - debug_str_offsets, - debug_line_str, + location_dwarf, out_strings, )?); dirs.push(dir_id); @@ -132,9 +139,7 @@ where &file_entry.path_name(), gimli::DW_FORM_string, unit, - debug_str, - debug_str_offsets, - debug_line_str, + location_dwarf, out_strings, )?, dir_id, diff --git a/crates/cranelift/src/debug/transform/mod.rs b/crates/cranelift/src/debug/transform/mod.rs index 8a0b3e3ccc..788550d0ee 100644 --- a/crates/cranelift/src/debug/transform/mod.rs +++ b/crates/cranelift/src/debug/transform/mod.rs @@ -7,12 +7,12 @@ use crate::CompiledFunctionsMetadata; use anyhow::Error; use cranelift_codegen::isa::TargetIsa; use gimli::{ - write, DebugAddr, DebugLine, DebugLineStr, DebugStr, DebugStrOffsets, LocationLists, - RangeLists, UnitSectionOffset, + write, DebugAddr, DebugLine, DebugStr, Dwarf, DwarfPackage, LittleEndian, LocationLists, + RangeLists, Section, Unit, UnitSectionOffset, }; -use std::collections::HashSet; +use std::{collections::HashSet, fmt::Debug}; use thiserror::Error; -use wasmtime_environ::DebugInfoData; +use wasmtime_environ::{DebugInfoData, ModuleTranslation, Tunables}; pub use address_transform::AddressTransform; @@ -26,9 +26,12 @@ mod simulate; mod unit; mod utils; -pub(crate) trait Reader: gimli::Reader {} +pub(crate) trait Reader: gimli::Reader + Send + Sync {} -impl<'input, Endian> Reader for gimli::EndianSlice<'input, Endian> where Endian: gimli::Endianity {} +impl<'input, Endian> Reader for gimli::EndianSlice<'input, Endian> where + Endian: gimli::Endianity + Send + Sync +{ +} #[derive(Error, Debug)] #[error("Debug info transform error: {0}")] @@ -39,8 +42,6 @@ where R: Reader, { debug_str: &'a DebugStr, - debug_str_offsets: &'a DebugStrOffsets, - debug_line_str: &'a DebugLineStr, debug_line: &'a DebugLine, debug_addr: &'a DebugAddr, rnglists: &'a RangeLists, @@ -48,19 +49,113 @@ where reachable: &'a HashSet, } -pub fn transform_dwarf( +fn load_dwp<'data>( + translation: ModuleTranslation<'data>, + buffer: &'data [u8], +) -> anyhow::Result>> { + let endian_slice = gimli::EndianSlice::new(buffer, LittleEndian); + + let dwarf_package = DwarfPackage::load( + |id| -> anyhow::Result<_> { + let slice = match id { + gimli::SectionId::DebugAbbrev => { + translation.debuginfo.dwarf.debug_abbrev.reader().slice() + } + gimli::SectionId::DebugInfo => { + translation.debuginfo.dwarf.debug_info.reader().slice() + } + gimli::SectionId::DebugLine => { + translation.debuginfo.dwarf.debug_line.reader().slice() + } + gimli::SectionId::DebugStr => { + translation.debuginfo.dwarf.debug_str.reader().slice() + } + gimli::SectionId::DebugStrOffsets => translation + .debuginfo + .dwarf + .debug_str_offsets + .reader() + .slice(), + gimli::SectionId::DebugLoc => translation.debuginfo.debug_loc.reader().slice(), + gimli::SectionId::DebugLocLists => { + translation.debuginfo.debug_loclists.reader().slice() + } + gimli::SectionId::DebugRngLists => { + translation.debuginfo.debug_rnglists.reader().slice() + } + gimli::SectionId::DebugTypes => { + translation.debuginfo.dwarf.debug_types.reader().slice() + } + gimli::SectionId::DebugCuIndex => { + translation.debuginfo.debug_cu_index.reader().slice() + } + gimli::SectionId::DebugTuIndex => { + translation.debuginfo.debug_tu_index.reader().slice() + } + _ => &buffer, + }; + + Ok(gimli::EndianSlice::new(slice, gimli::LittleEndian)) + }, + endian_slice, + )?; + + Ok(dwarf_package) +} + +/// Attempts to load a DWARF package using the passed bytes. +fn read_dwarf_package_from_bytes<'data>( + dwp_bytes: &'data [u8], + buffer: &'data [u8], + tunables: &Tunables, +) -> Option>> { + let mut validator = wasmparser::Validator::new(); + let parser = wasmparser::Parser::new(0); + let mut types = wasmtime_environ::ModuleTypesBuilder::new(&validator); + let translation = + match wasmtime_environ::ModuleEnvironment::new(tunables, &mut validator, &mut types) + .translate(parser, dwp_bytes) + { + Ok(translation) => translation, + Err(e) => { + log::warn!("failed to parse wasm dwarf package: {e:?}"); + return None; + } + }; + + match load_dwp(translation, buffer) { + Ok(package) => Some(package), + Err(err) => { + log::warn!("Failed to load Dwarf package {}", err); + None + } + } +} + +pub fn transform_dwarf<'data>( isa: &dyn TargetIsa, di: &DebugInfoData, funcs: &CompiledFunctionsMetadata, memory_offset: &ModuleMemoryOffset, + dwarf_package_bytes: Option<&[u8]>, + tunables: &Tunables, ) -> Result { let addr_tr = AddressTransform::new(funcs, &di.wasm_file); - let reachable = build_dependencies(&di.dwarf, &addr_tr)?.get_reachable(); + + let buffer = Vec::new(); + + let dwarf_package = dwarf_package_bytes + .map( + |bytes| -> Option>> { + read_dwarf_package_from_bytes(bytes, &buffer, tunables) + }, + ) + .flatten(); + + let reachable = build_dependencies(&di.dwarf, &dwarf_package, &addr_tr)?.get_reachable(); let context = DebugInputContext { debug_str: &di.dwarf.debug_str, - debug_str_offsets: &di.dwarf.debug_str_offsets, - debug_line_str: &di.dwarf.debug_line_str, debug_line: &di.dwarf.debug_line, debug_addr: &di.dwarf.debug_addr, rnglists: &di.dwarf.ranges, @@ -84,11 +179,29 @@ pub fn transform_dwarf( let mut translated = HashSet::new(); let mut iter = di.dwarf.debug_info.units(); + while let Some(header) = iter.next().unwrap_or(None) { let unit = di.dwarf.unit(header)?; + + let mut resolved_unit = None; + let mut split_dwarf = None; + + if let gimli::UnitType::Skeleton(_dwo_id) = unit.header.type_() { + if let Some(dwarf_package) = &dwarf_package { + if let Some((fused, fused_dwarf)) = + replace_unit_from_split_dwarf(&unit, dwarf_package, &di.dwarf) + { + resolved_unit = Some(fused); + split_dwarf = Some(fused_dwarf); + } + } + } + if let Some((id, ref_map, pending_refs)) = clone_unit( &di.dwarf, - unit, + &unit, + resolved_unit.as_ref(), + split_dwarf.as_ref(), &context, &addr_tr, funcs, @@ -124,3 +237,20 @@ pub fn transform_dwarf( strings: out_strings, }) } + +fn replace_unit_from_split_dwarf<'a>( + unit: &'a Unit, usize>, + dwp: &DwarfPackage>, + parent: &Dwarf>, +) -> Option<( + Unit, usize>, + Dwarf>, +)> { + let dwo_id = unit.dwo_id?; + let split_unit_dwarf = dwp.find_cu(dwo_id, parent).ok()??; + let unit_header = split_unit_dwarf.debug_info.units().next().ok()??; + Some(( + split_unit_dwarf.unit(unit_header).unwrap(), + split_unit_dwarf, + )) +} diff --git a/crates/cranelift/src/debug/transform/unit.rs b/crates/cranelift/src/debug/transform/unit.rs index eefed56d07..5612dbdf96 100644 --- a/crates/cranelift/src/debug/transform/unit.rs +++ b/crates/cranelift/src/debug/transform/unit.rs @@ -5,7 +5,7 @@ use super::line_program::clone_line_program; use super::range_info_builder::RangeInfoBuilder; use super::refs::{PendingDebugInfoRefs, PendingUnitRefs, UnitRefsMap}; use super::utils::{add_internal_types, append_vmctx_info, get_function_frame_info}; -use super::{DebugInputContext, Reader, TransformError}; +use super::{DebugInputContext, Reader}; use crate::debug::ModuleMemoryOffset; use crate::CompiledFunctionsMetadata; use anyhow::{Context, Error}; @@ -256,7 +256,9 @@ fn is_dead_code(entry: &DebuggingInformationEntry) -> bool { pub(crate) fn clone_unit<'a, R>( dwarf: &gimli::Dwarf, - unit: Unit, + unit: &Unit, + split_unit: Option<&Unit>, + split_dwarf: Option<&gimli::Dwarf>, context: &DebugInputContext, addr_tr: &'a AddressTransform, funcs: &'a CompiledFunctionsMetadata, @@ -275,20 +277,35 @@ where let mut pending_di_refs = PendingDebugInfoRefs::new(); let mut stack = Vec::new(); + let mut program_unit = unit; + let mut skeleton_die = None; + + // Get entries in outer scope to avoid borrowing on short lived temporary. + let mut skeleton_entries = unit.entries(); + if let Some(unit) = split_unit { + program_unit = unit; + + // From the spec, a skeleton unit has no children so we can assume the first, and only, entry is the DW_TAG_skeleton_unit (https://dwarfstd.org/doc/DWARF5.pdf). + if let Some(die_tuple) = skeleton_entries.next_dfs()? { + skeleton_die = Some(die_tuple.1); + } + } + // Iterate over all of this compilation unit's entries. - let mut entries = unit.entries(); + let mut entries = program_unit.entries(); let (mut comp_unit, unit_id, file_map, file_index_base, cu_low_pc, wp_die_id, vmctx_die_id) = if let Some((depth_delta, entry)) = entries.next_dfs()? { assert_eq!(depth_delta, 0); let (out_line_program, debug_line_offset, file_map, file_index_base) = clone_line_program( - &unit, + split_dwarf.unwrap_or(dwarf), + dwarf, + program_unit, entry, + skeleton_die, addr_tr, out_encoding, context.debug_str, - context.debug_str_offsets, - context.debug_line_str, context.debug_line, out_strings, )?; @@ -299,23 +316,11 @@ where let root_id = comp_unit.root(); die_ref_map.insert(entry.offset(), root_id); - - let cu_low_pc = if let Some(AttributeValue::Addr(addr)) = - entry.attr_value(gimli::DW_AT_low_pc)? - { - addr - } else if let Some(AttributeValue::DebugAddrIndex(i)) = - entry.attr_value(gimli::DW_AT_low_pc)? - { - context.debug_addr.get_address(4, unit.addr_base, i)? - } else { - // FIXME? return Err(TransformError("No low_pc for unit header").into()); - 0 - }; + let cu_low_pc = unit.low_pc; clone_die_attributes( - dwarf, - &unit, + split_dwarf.unwrap_or(dwarf), + &program_unit, entry, context, addr_tr, @@ -346,7 +351,9 @@ where vmctx_die_id, ) } else { - return Err(TransformError("Unexpected unit header").into()); + // Can happen when the DWARF is split and we dont have the package/dwo files. + // This is a better user experience than errorring. + return Ok(None); // empty: } } else { return Ok(None); // empty @@ -469,7 +476,7 @@ where die_ref_map.insert(entry.offset(), die_id); clone_die_attributes( - dwarf, + split_dwarf.unwrap_or(dwarf), &unit, entry, context, diff --git a/crates/cranelift/src/debug/write_debuginfo.rs b/crates/cranelift/src/debug/write_debuginfo.rs index e5e6269f8e..35b9fed72e 100644 --- a/crates/cranelift/src/debug/write_debuginfo.rs +++ b/crates/cranelift/src/debug/write_debuginfo.rs @@ -179,8 +179,17 @@ pub fn emit_dwarf<'a>( debuginfo_data: &DebugInfoData, funcs: &CompiledFunctionsMetadata, memory_offset: &ModuleMemoryOffset, + dwarf_package_bytes: Option<&[u8]>, + tunables: &wasmtime_environ::Tunables, ) -> anyhow::Result> { - let dwarf = transform_dwarf(isa, debuginfo_data, funcs, memory_offset)?; + let dwarf = transform_dwarf( + isa, + debuginfo_data, + funcs, + memory_offset, + dwarf_package_bytes, + tunables, + )?; let frame_table = create_frame_table(isa, funcs); let sections = emit_dwarf_sections(isa, dwarf, frame_table)?; Ok(sections) diff --git a/crates/environ/src/compile/mod.rs b/crates/environ/src/compile/mod.rs index 993a6c6cdd..a88c0f32b6 100644 --- a/crates/environ/src/compile/mod.rs +++ b/crates/environ/src/compile/mod.rs @@ -377,6 +377,8 @@ pub trait Compiler: Send + Sync { obj: &mut Object<'_>, translation: &ModuleTranslation<'_>, funcs: &PrimaryMap, + dwarf_package_bytes: Option<&[u8]>, + tunables: &Tunables, ) -> Result<()>; /// Creates a new System V Common Information Entry for the ISA. diff --git a/crates/environ/src/compile/module_artifacts.rs b/crates/environ/src/compile/module_artifacts.rs index 7210f9139c..68f19e377b 100644 --- a/crates/environ/src/compile/module_artifacts.rs +++ b/crates/environ/src/compile/module_artifacts.rs @@ -2,8 +2,8 @@ //! with `bincode` as part of a module's compilation process. use crate::{ - obj, CompiledFunctionInfo, CompiledModuleInfo, DefinedFuncIndex, FunctionLoc, FunctionName, - MemoryInitialization, Metadata, ModuleTranslation, PrimaryMap, Tunables, + obj, CompiledFunctionInfo, CompiledModuleInfo, DebugInfoData, DefinedFuncIndex, FunctionLoc, + FunctionName, MemoryInitialization, Metadata, ModuleTranslation, PrimaryMap, Tunables, }; use anyhow::{bail, Result}; use object::write::{Object, SectionId, StandardSegment, WritableBuffer}; @@ -57,6 +57,31 @@ impl<'a> ObjectBuilder<'a> { } } + /// Insert the wasm raw wasm-based debuginfo into the output. + /// Note that this is distinct from the native debuginfo + /// possibly generated by the native compiler, hence these sections + /// getting wasm-specific names. + pub fn push_debuginfo( + &mut self, + dwarf: &mut Vec<(u8, Range)>, + debuginfo: &DebugInfoData<'_>, + ) { + self.push_debug(dwarf, &debuginfo.dwarf.debug_abbrev); + self.push_debug(dwarf, &debuginfo.dwarf.debug_addr); + self.push_debug(dwarf, &debuginfo.dwarf.debug_aranges); + self.push_debug(dwarf, &debuginfo.dwarf.debug_info); + self.push_debug(dwarf, &debuginfo.dwarf.debug_line); + self.push_debug(dwarf, &debuginfo.dwarf.debug_line_str); + self.push_debug(dwarf, &debuginfo.dwarf.debug_str); + self.push_debug(dwarf, &debuginfo.dwarf.debug_str_offsets); + self.push_debug(dwarf, &debuginfo.debug_ranges); + self.push_debug(dwarf, &debuginfo.debug_rnglists); + self.push_debug(dwarf, &debuginfo.debug_cu_index); + + // Sort this for binary-search-lookup later in `symbolize_context`. + dwarf.sort_by_key(|(id, _)| *id); + } + /// Completes compilation of the `translation` specified, inserting /// everything necessary into the `Object` being built. /// @@ -188,19 +213,8 @@ impl<'a> ObjectBuilder<'a> { // getting wasm-specific names. let mut dwarf = Vec::new(); if self.tunables.parse_wasm_debuginfo { - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_abbrev); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_addr); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_aranges); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_info); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_line); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_line_str); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_str); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_str_offsets); - self.push_debug(&mut dwarf, &debuginfo.debug_ranges); - self.push_debug(&mut dwarf, &debuginfo.debug_rnglists); + self.push_debuginfo(&mut dwarf, &debuginfo); } - // Sort this for binary-search-lookup later in `symbolize_context`. - dwarf.sort_by_key(|(id, _)| *id); Ok(CompiledModuleInfo { module, diff --git a/crates/environ/src/module_environ.rs b/crates/environ/src/module_environ.rs index 0c119ae74f..fd86fbc482 100644 --- a/crates/environ/src/module_environ.rs +++ b/crates/environ/src/module_environ.rs @@ -122,10 +122,12 @@ pub struct DebugInfoData<'a> { pub dwarf: Dwarf<'a>, pub name_section: NameSection<'a>, pub wasm_file: WasmFileInfo, - debug_loc: gimli::DebugLoc>, - debug_loclists: gimli::DebugLocLists>, + pub debug_loc: gimli::DebugLoc>, + pub debug_loclists: gimli::DebugLocLists>, pub debug_ranges: gimli::DebugRanges>, pub debug_rnglists: gimli::DebugRngLists>, + pub debug_cu_index: gimli::DebugCuIndex>, + pub debug_tu_index: gimli::DebugTuIndex>, } #[allow(missing_docs)] @@ -782,7 +784,7 @@ and for re-adding support for interface types you can see this issue: } fn register_dwarf_section(&mut self, section: &CustomSectionReader<'data>) { - let name = section.name(); + let name = section.name().trim_end_matches(".dwo"); if !name.starts_with(".debug_") { return; } @@ -800,7 +802,9 @@ and for re-adding support for interface types you can see this issue: // `gimli::Dwarf` fields. ".debug_abbrev" => dwarf.debug_abbrev = gimli::DebugAbbrev::new(data, endian), ".debug_addr" => dwarf.debug_addr = gimli::DebugAddr::from(slice), - ".debug_info" => dwarf.debug_info = gimli::DebugInfo::new(data, endian), + ".debug_info" => { + dwarf.debug_info = gimli::DebugInfo::new(data, endian); + } ".debug_line" => dwarf.debug_line = gimli::DebugLine::new(data, endian), ".debug_line_str" => dwarf.debug_line_str = gimli::DebugLineStr::from(slice), ".debug_str" => dwarf.debug_str = gimli::DebugStr::new(data, endian), @@ -818,9 +822,12 @@ and for re-adding support for interface types you can see this issue: ".debug_ranges" => info.debug_ranges = gimli::DebugRanges::new(data, endian), ".debug_rnglists" => info.debug_rnglists = gimli::DebugRngLists::new(data, endian), + // DWARF package fields + ".debug_cu_index" => info.debug_cu_index = gimli::DebugCuIndex::new(data, endian), + ".debug_tu_index" => info.debug_tu_index = gimli::DebugTuIndex::new(data, endian), + // We don't use these at the moment. ".debug_aranges" | ".debug_pubnames" | ".debug_pubtypes" => return, - other => { log::warn!("unknown debug section `{}`", other); return; diff --git a/crates/wasmtime/src/compile.rs b/crates/wasmtime/src/compile.rs index 15e316e315..5ea9e33bc2 100644 --- a/crates/wasmtime/src/compile.rs +++ b/crates/wasmtime/src/compile.rs @@ -29,6 +29,7 @@ use std::{ collections::{btree_map, BTreeMap, BTreeSet, HashMap, HashSet}, mem, }; + #[cfg(feature = "component-model")] use wasmtime_environ::component::Translator; use wasmtime_environ::{ @@ -61,6 +62,7 @@ pub use self::runtime::finish_object; pub(crate) fn build_artifacts( engine: &Engine, wasm: &[u8], + dwarf_package: Option<&[u8]>, ) -> Result<(T, Option<(CompiledModuleInfo, ModuleTypes)>)> { let tunables = engine.tunables(); @@ -101,6 +103,7 @@ pub(crate) fn build_artifacts( engine, compiled_funcs, std::iter::once(translation).collect(), + dwarf_package, )?; let info = compilation_artifacts.unwrap_as_module_info(); @@ -118,9 +121,10 @@ pub(crate) fn build_artifacts( /// The output artifact here is the serialized object file contained within /// an owned mmap along with metadata about the compilation itself. #[cfg(feature = "component-model")] -pub(crate) fn build_component_artifacts( +pub(crate) fn build_component_artifacts<'a, T: FinishedObject>( engine: &Engine, binary: &[u8], + _dwarf_package: Option<&[u8]>, ) -> Result<(T, Option)> { use wasmtime_environ::component::{ CompiledComponentInfo, ComponentArtifacts, ComponentTypesBuilder, @@ -159,6 +163,7 @@ pub(crate) fn build_component_artifacts( engine, compiled_funcs, module_translations, + None, // TODO: Support dwarf packages for components. )?; let (types, ty) = types.finish( &compilation_artifacts.modules, @@ -649,6 +654,7 @@ impl FunctionIndices { engine: &'a Engine, compiled_funcs: Vec<(String, Box)>, translations: PrimaryMap>, + dwarf_package_bytes: Option<&[u8]>, ) -> Result<(wasmtime_environ::ObjectBuilder<'a>, Artifacts)> { // Append all the functions to the ELF file. // @@ -713,7 +719,13 @@ impl FunctionIndices { }) .collect(); if !funcs.is_empty() { - compiler.append_dwarf(&mut obj, translation, &funcs)?; + compiler.append_dwarf( + &mut obj, + translation, + &funcs, + dwarf_package_bytes, + tunables, + )?; } } } diff --git a/crates/wasmtime/src/compile/code_builder.rs b/crates/wasmtime/src/compile/code_builder.rs index 00b456d532..58afd663f0 100644 --- a/crates/wasmtime/src/compile/code_builder.rs +++ b/crates/wasmtime/src/compile/code_builder.rs @@ -40,6 +40,8 @@ pub struct CodeBuilder<'a> { pub(super) engine: &'a Engine, wasm: Option>, wasm_path: Option>, + dwarf_package: Option>, + dwarf_package_path: Option>, wat: bool, } @@ -51,6 +53,8 @@ impl<'a> CodeBuilder<'a> { engine, wasm: None, wasm_path: None, + dwarf_package: None, + dwarf_package_path: None, wat: cfg!(feature = "wat"), } } @@ -76,6 +80,11 @@ impl<'a> CodeBuilder<'a> { } self.wasm = Some(wasm_bytes.into()); self.wasm_path = wasm_path.map(|p| p.into()); + + if self.wasm_path.is_some() { + self.dwarf_package_from_wasm_path()?; + } + Ok(self) } @@ -104,6 +113,10 @@ impl<'a> CodeBuilder<'a> { /// either as a WebAssembly binary or as a WebAssembly text file. The /// contents are inspected to do this, the file extension is not consulted. /// + /// A DWARF package file will be probed using the root of `file` and with a + /// `.dwp` extension. If found, it will be loaded and DWARF fusion + /// performed. + /// /// # Errors /// /// If wasm bytes have already been configured via a call to this method or @@ -111,6 +124,9 @@ impl<'a> CodeBuilder<'a> { /// /// If `file` can't be read or an error happens reading it then that will /// also be returned. + /// + /// If DWARF fusion is performed and the DWARF packaged file cannot be read + /// then an error will be returned. pub fn wasm_file(&mut self, file: &'a Path) -> Result<&mut Self> { if self.wasm.is_some() { bail!("cannot call `wasm` or `wasm_file` twice"); @@ -119,6 +135,8 @@ impl<'a> CodeBuilder<'a> { .with_context(|| format!("failed to read input file: {}", file.display()))?; self.wasm = Some(wasm.into()); self.wasm_path = Some(file.into()); + self.dwarf_package_from_wasm_path()?; + Ok(self) } @@ -139,6 +157,61 @@ impl<'a> CodeBuilder<'a> { Ok((&wasm[..]).into()) } + /// Explicitly specify DWARF `.dwp` path. + /// + /// # Errors + /// + /// This method will return an error if the `.dwp` file has already been set + /// through [`CodeBuilder::dwarf_package`] or auto-detection in + /// [`CodeBuilder::wasm_file`]. + /// + /// This method will also return an error if `file` cannot be read. + pub fn dwarf_package_file(&mut self, file: &Path) -> Result<&mut Self> { + if self.dwarf_package.is_some() { + bail!("cannot call `dwarf_package` or `dwarf_package_file` twice"); + } + + let dwarf_package = std::fs::read(file) + .with_context(|| format!("failed to read dwarf input file: {}", file.display()))?; + self.dwarf_package_path = Some(Cow::Owned(file.to_owned())); + self.dwarf_package = Some(dwarf_package.into()); + + Ok(self) + } + + fn dwarf_package_from_wasm_path(&mut self) -> Result<&mut Self> { + let dwarf_package_path_buf = self.wasm_path.as_ref().unwrap().with_extension("dwp"); + if dwarf_package_path_buf.exists() { + return self.dwarf_package_file(dwarf_package_path_buf.as_path()); + } + + Ok(self) + } + + /// Gets the DWARF package. + pub(super) fn dwarf_package_binary(&self) -> Option<&[u8]> { + return self.dwarf_package.as_deref(); + } + + /// Set the DWARF package binary. + /// + /// Initializes `dwarf_package` from `dwp_bytes` in preparation for + /// DWARF fusion. Allows the DWARF package to be supplied as a byte array + /// when the file probing performed in `wasm_file` is not appropriate. + /// + /// # Errors + /// + /// Returns an error if the `*.dwp` file is already set via auto-probing in + /// [`CodeBuilder::wasm_file`] or explicitly via + /// [`CodeBuilder::dwarf_package_file`]. + pub fn dwarf_package(&mut self, dwp_bytes: &'a [u8]) -> Result<&mut Self> { + if self.dwarf_package.is_some() { + bail!("cannot call `dwarf_package` or `dwarf_package_file` twice"); + } + self.dwarf_package = Some(dwp_bytes.into()); + Ok(self) + } + /// Finishes this compilation and produces a serialized list of bytes. /// /// This method requires that either [`CodeBuilder::wasm`] or @@ -157,7 +230,8 @@ impl<'a> CodeBuilder<'a> { /// compilation-related error is encountered. pub fn compile_module_serialized(&self) -> Result> { let wasm = self.wasm_binary()?; - let (v, _) = super::build_artifacts(self.engine, &wasm)?; + let dwarf_package = self.dwarf_package_binary(); + let (v, _) = super::build_artifacts(self.engine, &wasm, dwarf_package.as_deref())?; Ok(v) } @@ -168,7 +242,7 @@ impl<'a> CodeBuilder<'a> { #[cfg_attr(docsrs, doc(cfg(feature = "component-model")))] pub fn compile_component_serialized(&self) -> Result> { let bytes = self.wasm_binary()?; - let (v, _) = super::build_component_artifacts(self.engine, &bytes)?; + let (v, _) = super::build_component_artifacts(self.engine, &bytes, None)?; Ok(v) } } diff --git a/crates/wasmtime/src/compile/runtime.rs b/crates/wasmtime/src/compile/runtime.rs index fde8dfcdfe..0887cfb364 100644 --- a/crates/wasmtime/src/compile/runtime.rs +++ b/crates/wasmtime/src/compile/runtime.rs @@ -11,9 +11,10 @@ use wasmtime_runtime::MmapVec; impl<'a> CodeBuilder<'a> { fn compile_cached( &self, - build_artifacts: fn(&Engine, &[u8]) -> Result<(MmapVecWrapper, Option)>, + build_artifacts: fn(&Engine, &[u8], Option<&[u8]>) -> Result<(MmapVecWrapper, Option)>, ) -> Result<(Arc, Option)> { let wasm = self.wasm_binary()?; + let dwarf_package = self.dwarf_package_binary(); self.engine .check_compatible_with_native_host() @@ -24,6 +25,7 @@ impl<'a> CodeBuilder<'a> { let state = ( HashedEngineCompileEnv(self.engine), &wasm, + &dwarf_package, // Don't hash this as it's just its own "pure" function pointer. NotHashed(build_artifacts), ); @@ -32,15 +34,18 @@ impl<'a> CodeBuilder<'a> { .get_data_raw( &state, // Cache miss, compute the actual artifacts - |(engine, wasm, build_artifacts)| -> Result<_> { - let (mmap, info) = (build_artifacts.0)(engine.0, wasm)?; + |(engine, wasm, dwarf_package, build_artifacts)| -> Result<_> { + let (mmap, info) = + (build_artifacts.0)(engine.0, wasm, dwarf_package.as_deref())?; let code = publish_mmap(mmap.0)?; Ok((code, info)) }, // Implementation of how to serialize artifacts - |(_engine, _wasm, _), (code, _info_and_types)| Some(code.mmap().to_vec()), + |(_engine, _wasm, _, _), (code, _info_and_types)| { + Some(code.mmap().to_vec()) + }, // Cache hit, deserialize the provided artifacts - |(engine, wasm, _), serialized_bytes| { + |(engine, wasm, _, _), serialized_bytes| { let kind = if wasmparser::Parser::is_component(&wasm) { ObjectKind::Component } else { @@ -55,7 +60,8 @@ impl<'a> CodeBuilder<'a> { #[cfg(not(feature = "cache"))] { - let (mmap, info_and_types) = build_artifacts(self.engine, &wasm)?; + let (mmap, info_and_types) = + build_artifacts(self.engine, &wasm, dwarf_package.as_deref())?; let code = publish_mmap(mmap.0)?; return Ok((code, info_and_types)); } diff --git a/crates/wasmtime/src/runtime/module.rs b/crates/wasmtime/src/runtime/module.rs index a0217c768e..04ecc47f1c 100644 --- a/crates/wasmtime/src/runtime/module.rs +++ b/crates/wasmtime/src/runtime/module.rs @@ -23,7 +23,6 @@ use wasmtime_runtime::{ CompiledModuleId, MemoryImage, MmapVec, ModuleMemoryImages, VMArrayCallFunction, VMNativeCallFunction, VMWasmCallFunction, }; - mod registry; pub use registry::{ diff --git a/crates/winch/src/compiler.rs b/crates/winch/src/compiler.rs index d59c7e713a..ecb93dacdf 100644 --- a/crates/winch/src/compiler.rs +++ b/crates/winch/src/compiler.rs @@ -233,6 +233,8 @@ impl wasmtime_environ::Compiler for Compiler { _obj: &mut Object<'_>, _translation: &ModuleTranslation<'_>, _funcs: &PrimaryMap, + _dwarf_package: Option<&[u8]>, + _tunables: &wasmtime_environ::Tunables, ) -> Result<()> { todo!() } diff --git a/tests/all/debug/lldb.rs b/tests/all/debug/lldb.rs index 14c093b319..b52a6f6aa3 100644 --- a/tests/all/debug/lldb.rs +++ b/tests/all/debug/lldb.rs @@ -247,3 +247,51 @@ check: exited with status )?; Ok(()) } + +/* C program used for this test, dwarf_fission.c, compiled with `emcc dwarf_fission.c -o dwarf_fission.wasm -gsplit-dwarf -gdwarf-5 -gpubnames -sWASM_BIGINT`: +#include + +int main() +{ + int i = 1; + i++; + return i - 2; +} + */ +#[test] +#[ignore] +#[cfg(all( + any(target_os = "linux", target_os = "macos"), + target_pointer_width = "64" +))] +pub fn test_debug_dwarf5_fission_lldb() -> Result<()> { + let output = lldb_with_script( + &[ + "-Ccache=n", + "-Ddebug-info", + "tests/all/debug/testsuite/dwarf_fission.wasm", + ], + r#"breakpoint set --file dwarf_fission.c --line 6 +r +fr v +s +fr v +c"#, + )?; + + check_lldb_output( + &output, + r#" +check: Breakpoint 1: no locations (pending) +check: Unable to resolve breakpoint to any actual locations. +check: 1 location added to breakpoint 1 +check: stop reason = breakpoint 1.1 +check: i = 1 +check: stop reason = step in +check: i = 2 +check: resuming +check: exited with status = 0 +"#, + )?; + Ok(()) +} diff --git a/tests/all/debug/testsuite/dwarf_fission.c b/tests/all/debug/testsuite/dwarf_fission.c new file mode 100644 index 0000000000..4dc174f901 --- /dev/null +++ b/tests/all/debug/testsuite/dwarf_fission.c @@ -0,0 +1,7 @@ +#include + +int main() { + int i = 1; + i++; + return i - 2; +} diff --git a/tests/all/debug/testsuite/dwarf_fission.dwp b/tests/all/debug/testsuite/dwarf_fission.dwp new file mode 100644 index 0000000000000000000000000000000000000000..e155c21fddb729ad2127edb319c282b7dcab8d36 GIT binary patch literal 652 zcmZ8f&ui2`6n-w>ftWt9f%!E}G5UA97N4?XNnswmaNkW41KV>d}jvT41o z-c&qz6Fi9jhu}Zq(X$uv?A7;b)#8J1-Z$^PdEdNYAS_b`0Q}uzu>dA?Rxe9AGnozx znd&qzo^ee7q-@KNbu^#IFp3IY`|)YcTFmp>mhfs1TLds}@3?ndz5*Z^8@B-(H!wDI z0jzZp-mdE+wTZg!E>g#5t+gxm-4)@{!Et+U6`&aa{~JJU`1BmbmoCK1svu=G4GWNR z|L}1CNZubmK9CQN?j1-8X=pMqSp^2vEX*dIS{J3svrcd1cm3|fRGp1!Rh^VOo5-j0 z$X9u~Ih)nLm)j>r{#2`~qZAGsg*u3b!+4+*)gNq!$*8aT{ZY`1^;R4VhPvCk1@UQE zBr-82$@uEOJ>C`IGdczLcS0ZKBHLx8{hr!_=L3EKc0$i4`)@C+qIu3h7!5_dsa1alX zH~HIU11zFo3F`RuvY?tvlg0Xst|$=ap9cLOQKaWaaWe8$XVd1AJwdJ!8x(s<3J(6Z IW0OtzFD@~Tvj6}9 literal 0 HcmV?d00001 diff --git a/tests/all/debug/testsuite/dwarf_fission.wasm b/tests/all/debug/testsuite/dwarf_fission.wasm new file mode 100644 index 0000000000000000000000000000000000000000..ed7a49a83b02c27411ccc178993854428d34012a GIT binary patch literal 142353 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 Bj4c2F literal 0 HcmV?d00001