Path: blob/main/crates/cranelift/src/debug/transform/line_program.rs
3054 views
use super::address_transform::AddressTransform;1use crate::debug::Reader;2use gimli::write;3use wasmtime_environ::error::Error;45pub(crate) fn clone_line_program(6mut transform: write::ConvertLineProgram<'_, Reader<'_>>,7addr_tr: &AddressTransform,8) -> Result<(write::LineProgram, Vec<write::FileId>), Error> {9while let Some(write::ConvertLineSequence {10start,11rows: saved_rows,12..13}) = transform.read_sequence()?14{15let Some(start) = start else {16continue;17};18if start == 0 {19continue;20}21let Some(index) = addr_tr.find_func_index(start) else {22// Some non-existent address found.23continue;24};25let Some(map) = addr_tr.map().get(index) else {26continue; // no code generated27};28let symbol = map.symbol;29let base_addr = map.offset;30transform.begin_sequence(Some(write::Address::Symbol { symbol, addend: 0 }));31// TODO track and place function declaration line here32let mut last_address = None;33for addr_map in map.addresses.iter() {34let Some(wasm_offset) = addr_map.wasm.checked_sub(start) else {35continue;36};37let mut saved_row =38match saved_rows.binary_search_by_key(&wasm_offset, |i| i.address_offset) {39Ok(i) => saved_rows[i],40Err(i) => {41if i > 0 {42saved_rows[i - 1]43} else {44continue;45}46}47};48// Ignore duplicates49if Some(saved_row.address_offset) != last_address {50let address_offset = if last_address.is_none() {51// Extend first entry to the function declaration52// TODO use the function declaration line instead53054} else {55(addr_map.generated - base_addr) as u6456};57last_address = Some(saved_row.address_offset);58saved_row.address_offset = address_offset;59transform.generate_row(saved_row);60}61}62transform.end_sequence(map.len as u64);63}64let (out_program, files) = transform.program();65Ok((out_program, files))66}676869