Path: blob/main/tests/all/native_debug/translate.rs
2450 views
use super::dump::{DwarfDumpSection, get_dwarfdump};1use super::obj::compile_cranelift;2use anyhow::{Result, format_err};3use filecheck::{CheckerBuilder, NO_VARIABLES};4use std::fs::read;5use tempfile::NamedTempFile;6use test_programs_artifacts::*;78fn check_wasm(wasm_path: &str, directives: &str) -> Result<()> {9println!("check {wasm_path}");10let wasm = read(wasm_path)?;11let obj_file = NamedTempFile::new()?;12let obj_path = obj_file.path().to_str().unwrap();13compile_cranelift(&wasm, Some(wasm_path.as_ref()), None, obj_path)?;14let dump = get_dwarfdump(obj_path, DwarfDumpSection::DebugInfo)?;15let mut builder = CheckerBuilder::new();16builder17.text(directives)18.map_err(|e| format_err!("unable to build checker: {e:?}"))?;19let checker = builder.finish();20let check = checker21.explain(&dump, NO_VARIABLES)22.map_err(|e| format_err!("{e:?}"))?;23assert!(check.0, "didn't pass check {}", check.1);24Ok(())25}2627#[test]28#[ignore]29fn test_debug_dwarf_translate_dead_code() -> Result<()> {30check_wasm(31DWARF_DEAD_CODE,32r##"33check: DW_TAG_compile_unit34# We don't have "bar" function because it is dead code35not: DW_AT_name ("bar")36# We have "foo" function37check: DW_TAG_subprogram38check: DW_AT_name ("foo")39# We have "baz" function40# it was marked `noinline` so isn't dead code41check: DW_TAG_subprogram42check: DW_AT_name ("baz")43"##,44)45}4647#[test]48#[ignore]49fn test_debug_dwarf_translate() -> Result<()> {50check_wasm(51DWARF_FIB_WASM,52r##"53check: DW_TAG_compile_unit54# We have "fib" function55check: DW_TAG_subprogram56check: DW_AT_name ("fib")57# Accepts one parameter58check: DW_TAG_formal_parameter59check: DW_AT_name ("n")60check: DW_AT_decl_line (3)61# Has four locals: t, a, b, i62check: DW_TAG_variable63check: DW_AT_name ("t")64check: DW_AT_decl_line (4)65check: DW_TAG_variable66check: DW_AT_name ("a")67check: DW_TAG_variable68check: DW_AT_name ("b")69check: DW_TAG_variable70check: DW_AT_name ("i")71check: DW_AT_decl_line (5)72"##,73)74}7576#[test]77#[ignore]78fn test_debug_dwarf5_translate() -> Result<()> {79check_wasm(80DWARF_FIB_WASM_DWARF5,81r##"82check: DW_TAG_compile_unit83# We have "fib" function84check: DW_TAG_subprogram85check: DW_AT_name ("fib")86# Accepts one parameter87check: DW_TAG_formal_parameter88check: DW_AT_name ("n")89check: DW_AT_decl_line (3)90# Has four locals: t, a, b, i91check: DW_TAG_variable92check: DW_AT_name ("t")93check: DW_AT_decl_line (4)94check: DW_TAG_variable95check: DW_AT_name ("a")96check: DW_TAG_variable97check: DW_AT_name ("b")98check: DW_TAG_variable99check: DW_AT_name ("i")100check: DW_AT_decl_line (5)101"##,102)103}104105#[test]106#[ignore]107fn test_debug_split_dwarf4_translate() -> Result<()> {108check_wasm(109DWARF_FIB_WASM_SPLIT4,110r##"111check: DW_TAG_compile_unit112# We have "fib" function113check: DW_TAG_subprogram114check: DW_AT_name ("fib")115# Accepts one parameter116check: DW_TAG_formal_parameter117check: DW_AT_name ("n")118check: DW_AT_decl_line (4)119# Has four locals: t, a, b, i120check: DW_TAG_variable121check: DW_AT_name ("t")122check: DW_AT_decl_line (5)123check: DW_TAG_variable124check: DW_AT_name ("a")125check: DW_TAG_variable126check: DW_AT_name ("b")127check: DW_TAG_variable128check: DW_AT_name ("i")129check: DW_AT_decl_line (6)130"##,131)132}133134#[test]135#[ignore]136fn test_debug_dwarf_translate_generated() -> Result<()> {137check_wasm(138DWARF_FRACTION_NORM,139r##"140check: DW_TAG_compile_unit141check: DW_TAG_compile_unit142check: DW_AT_producer ("wasmtime")143check: DW_AT_name ("dwarf_fraction_norm.wasm")144check: DW_AT_comp_dir ("/<wasm-module>")145check: DW_TAG_subprogram146check: DW_AT_name ("__wasm_call_ctors")147check: DW_AT_decl_file ("/<wasm-module>/dwarf_fraction_norm.wasm")148check: DW_AT_decl_line ($(=\d+))149"##,150)151}152153#[test]154#[ignore]155fn test_debug_dwarf_translate_fission() -> Result<()> {156check_wasm(157DWARF_FISSION,158r##"159check: DW_TAG_compile_unit160check: DW_AT_producer ("clang $(=.*)")161check: DW_AT_language (DW_LANG_C11)162check: DW_AT_name ("$(=.*)dwarf_fission.c")163check: DW_AT_ranges (0x$(=.+)164check: DW_AT_stmt_list (0x$(=.+))165check: DW_AT_comp_dir ("$(=.*)artifacts")166"##,167)168}169170171