102155232SChris Fallin use super::dump::{DwarfDumpSection, get_dwarfdump};
202155232SChris Fallin use super::obj::compile_cranelift;
302155232SChris Fallin use filecheck::{CheckerBuilder, NO_VARIABLES};
402155232SChris Fallin use tempfile::NamedTempFile;
5*94740588SNick Fitzgerald use wasmtime::{Result, format_err};
602155232SChris Fallin use wat::parse_str;
702155232SChris Fallin
802155232SChris Fallin #[allow(dead_code, reason = "used by conditionally-defined tests below")]
check_wat(wat: &str) -> Result<()>902155232SChris Fallin fn check_wat(wat: &str) -> Result<()> {
1002155232SChris Fallin let wasm = parse_str(wat)?;
1102155232SChris Fallin let obj_file = NamedTempFile::new()?;
1202155232SChris Fallin let obj_path = obj_file.path().to_str().unwrap();
1302155232SChris Fallin compile_cranelift(&wasm, None, None, obj_path)?;
1402155232SChris Fallin let dump = get_dwarfdump(obj_path, DwarfDumpSection::DebugInfo)?;
1502155232SChris Fallin let mut builder = CheckerBuilder::new();
1602155232SChris Fallin builder
1702155232SChris Fallin .text(wat)
1802155232SChris Fallin .map_err(|e| format_err!("unable to build checker: {e:?}"))?;
1902155232SChris Fallin let checker = builder.finish();
2002155232SChris Fallin let check = checker
2102155232SChris Fallin .explain(&dump, NO_VARIABLES)
2202155232SChris Fallin .map_err(|e| format_err!("{e:?}"))?;
2302155232SChris Fallin assert!(check.0, "didn't pass check {}", check.1);
2402155232SChris Fallin Ok(())
2502155232SChris Fallin }
2602155232SChris Fallin
2702155232SChris Fallin #[test]
2802155232SChris Fallin #[ignore]
2902155232SChris Fallin #[cfg(all(
3002155232SChris Fallin any(target_os = "linux", target_os = "macos"),
3102155232SChris Fallin target_pointer_width = "64"
3202155232SChris Fallin ))]
test_debug_dwarf_simulate_simple_x86_64() -> Result<()>3302155232SChris Fallin fn test_debug_dwarf_simulate_simple_x86_64() -> Result<()> {
3402155232SChris Fallin check_wat(
3502155232SChris Fallin r#"
3602155232SChris Fallin ;; check: DW_TAG_compile_unit
3702155232SChris Fallin (module
3802155232SChris Fallin ;; check: DW_TAG_subprogram
3902155232SChris Fallin ;; check: DW_AT_name ("wasm-function[0]")
4002155232SChris Fallin ;; check: DW_TAG_formal_parameter
4102155232SChris Fallin ;; check: DW_AT_name ("var0")
4202155232SChris Fallin ;; check: DW_AT_type
4302155232SChris Fallin ;; sameln: "i32"
4402155232SChris Fallin ;; check: DW_TAG_variable
4502155232SChris Fallin ;; check: DW_AT_name ("var1")
4602155232SChris Fallin ;; check: DW_AT_type
4702155232SChris Fallin ;; sameln: "i32"
4802155232SChris Fallin (func (param i32) (result i32)
4902155232SChris Fallin (local i32)
5002155232SChris Fallin local.get 0
5102155232SChris Fallin local.set 1
5202155232SChris Fallin local.get 1
5302155232SChris Fallin )
5402155232SChris Fallin )"#,
5502155232SChris Fallin )
5602155232SChris Fallin }
5702155232SChris Fallin
5802155232SChris Fallin #[test]
5902155232SChris Fallin #[ignore]
6002155232SChris Fallin #[cfg(all(
6102155232SChris Fallin any(target_os = "linux", target_os = "macos"),
6202155232SChris Fallin target_pointer_width = "64"
6302155232SChris Fallin ))]
test_debug_dwarf_simulate_with_imports_x86_64() -> Result<()>6402155232SChris Fallin fn test_debug_dwarf_simulate_with_imports_x86_64() -> Result<()> {
6502155232SChris Fallin check_wat(
6602155232SChris Fallin r#"
6702155232SChris Fallin ;; check: DW_TAG_compile_unit
6802155232SChris Fallin (module
6902155232SChris Fallin ;; check: DW_TAG_subprogram
7002155232SChris Fallin ;; check: DW_AT_name ("func1")
7102155232SChris Fallin (import "foo" "bar" (func $import1) )
7202155232SChris Fallin (func $func1 (result i32)
7302155232SChris Fallin i32.const 1
7402155232SChris Fallin )
7502155232SChris Fallin )"#,
7602155232SChris Fallin )
7702155232SChris Fallin }
7802155232SChris Fallin
7902155232SChris Fallin #[test]
8002155232SChris Fallin #[ignore]
8102155232SChris Fallin #[cfg(all(
8202155232SChris Fallin any(target_os = "linux", target_os = "macos"),
8302155232SChris Fallin target_pointer_width = "64"
8402155232SChris Fallin ))]
test_debug_dwarf_simulate_with_invalid_name_x86_64() -> Result<()>8502155232SChris Fallin fn test_debug_dwarf_simulate_with_invalid_name_x86_64() -> Result<()> {
8602155232SChris Fallin check_wat(
8702155232SChris Fallin r#"
8802155232SChris Fallin ;; check: DW_TAG_compile_unit
8902155232SChris Fallin (module (@name "\00")
9002155232SChris Fallin ;; check: DW_TAG_subprogram
9102155232SChris Fallin ;; check: DW_AT_name ("wasm-function[1]")
9202155232SChris Fallin (import "foo" "bar" (func $import1) )
9302155232SChris Fallin (func (@name "\00f") (result i32)
9402155232SChris Fallin (local (@name "l\00") i32)
9502155232SChris Fallin i32.const 1
9602155232SChris Fallin )
9702155232SChris Fallin )"#,
9802155232SChris Fallin )
9902155232SChris Fallin }
100