102155232SChris Fallin use filecheck::{CheckerBuilder, NO_VARIABLES};
202155232SChris Fallin use std::env;
302155232SChris Fallin use std::io::Write;
402155232SChris Fallin use std::process::Command;
502155232SChris Fallin use tempfile::NamedTempFile;
602155232SChris Fallin use test_programs_artifacts::*;
794740588SNick Fitzgerald use wasmtime::{Result, bail, format_err};
802155232SChris Fallin 
902155232SChris Fallin macro_rules! assert_test_exists {
1002155232SChris Fallin     ($name:ident) => {
1102155232SChris Fallin         #[expect(unused_imports, reason = "here to assert tests exist")]
1202155232SChris Fallin         use self::$name as _;
1302155232SChris Fallin     };
1402155232SChris Fallin }
1502155232SChris Fallin foreach_dwarf!(assert_test_exists);
1602155232SChris Fallin 
lldb_with_script(args: &[&str], script: &str) -> Result<String>1702155232SChris Fallin fn lldb_with_script(args: &[&str], script: &str) -> Result<String> {
1802155232SChris Fallin     let _ = env_logger::try_init();
1902155232SChris Fallin 
2002155232SChris Fallin     let lldb_path = env::var("LLDB").unwrap_or("lldb".to_string());
2102155232SChris Fallin     let mut cmd = Command::new(&lldb_path);
2202155232SChris Fallin 
2302155232SChris Fallin     cmd.arg("--batch");
2402155232SChris Fallin     if cfg!(target_os = "macos") {
2502155232SChris Fallin         cmd.args(&["-o", "settings set plugin.jit-loader.gdb.enable on"]);
2602155232SChris Fallin     }
2702155232SChris Fallin     let mut script_file = NamedTempFile::new()?;
2802155232SChris Fallin     script_file.write(script.as_bytes())?;
2902155232SChris Fallin     let script_path = script_file.path().to_str().unwrap();
3002155232SChris Fallin     cmd.args(&["-s", &script_path]);
3102155232SChris Fallin 
3202155232SChris Fallin     let mut me = std::env::current_exe().expect("current_exe specified");
3302155232SChris Fallin     me.pop(); // chop off the file name
3402155232SChris Fallin     me.pop(); // chop off `deps`
3502155232SChris Fallin     if cfg!(target_os = "windows") {
3602155232SChris Fallin         me.push("wasmtime.exe");
3702155232SChris Fallin     } else {
3802155232SChris Fallin         me.push("wasmtime");
3902155232SChris Fallin     }
4002155232SChris Fallin     cmd.arg(me);
4102155232SChris Fallin 
4202155232SChris Fallin     cmd.arg("--");
4302155232SChris Fallin     cmd.args(args);
4402155232SChris Fallin 
4502155232SChris Fallin     log::trace!("Running command: {cmd:?}");
4602155232SChris Fallin     let output = cmd.output().expect("success");
4702155232SChris Fallin 
4802155232SChris Fallin     let stdout = String::from_utf8(output.stdout)?;
4902155232SChris Fallin     log::trace!("--- sdout ---\n{stdout}");
5002155232SChris Fallin 
5102155232SChris Fallin     let stderr = String::from_utf8(output.stderr)?;
5202155232SChris Fallin     log::trace!("--- sderr ---\n{stderr}");
5302155232SChris Fallin 
5402155232SChris Fallin     if !output.status.success() {
5502155232SChris Fallin         bail!(
5602155232SChris Fallin             "failed to execute {cmd:?}:\n\
5702155232SChris Fallin             --- stderr ---\n\
5802155232SChris Fallin             {stderr}\n\
5902155232SChris Fallin             --- stdout ---\n\
6002155232SChris Fallin             {stdout}",
6102155232SChris Fallin         );
6202155232SChris Fallin     }
6302155232SChris Fallin     Ok(stdout)
6402155232SChris Fallin }
6502155232SChris Fallin 
check_lldb_output(output: &str, directives: &str) -> Result<()>6602155232SChris Fallin fn check_lldb_output(output: &str, directives: &str) -> Result<()> {
6702155232SChris Fallin     let mut builder = CheckerBuilder::new();
6802155232SChris Fallin     builder
6902155232SChris Fallin         .text(directives)
7002155232SChris Fallin         .map_err(|e| format_err!("unable to build checker: {e:?}"))?;
7102155232SChris Fallin     let checker = builder.finish();
7202155232SChris Fallin     let check = checker
7302155232SChris Fallin         .explain(output, NO_VARIABLES)
7402155232SChris Fallin         .map_err(|e| format_err!("{e:?}"))?;
7502155232SChris Fallin     assert!(check.0, "didn't pass check {}", check.1);
7602155232SChris Fallin     Ok(())
7702155232SChris Fallin }
7802155232SChris Fallin 
7902155232SChris Fallin #[allow(dead_code, reason = "tested elsewhere")]
dwarf_dead_code()8002155232SChris Fallin fn dwarf_dead_code() {} // this is tested over in `translate.rs`
8102155232SChris Fallin 
8202155232SChris Fallin #[test]
8302155232SChris Fallin #[ignore]
dwarf_fib_wasm() -> Result<()>8402155232SChris Fallin pub fn dwarf_fib_wasm() -> Result<()> {
8502155232SChris Fallin     let output = lldb_with_script(
8602155232SChris Fallin         &[
8702155232SChris Fallin             "-Ccache=n",
8802155232SChris Fallin             "-Ddebug-info",
8902155232SChris Fallin             "-Oopt-level=0",
9002155232SChris Fallin             "--invoke",
9102155232SChris Fallin             "fib",
9202155232SChris Fallin             DWARF_FIB_WASM,
9302155232SChris Fallin             "3",
9402155232SChris Fallin         ],
9502155232SChris Fallin         r#"b fib
9602155232SChris Fallin r
9702155232SChris Fallin fr v
9802155232SChris Fallin c"#,
9902155232SChris Fallin     )?;
10002155232SChris Fallin 
10102155232SChris Fallin     check_lldb_output(
10202155232SChris Fallin         &output,
10302155232SChris Fallin         r#"
10402155232SChris Fallin check: Breakpoint 1: no locations (pending)
10502155232SChris Fallin check: Unable to resolve breakpoint to any actual locations.
10602155232SChris Fallin check: 1 location added to breakpoint 1
10702155232SChris Fallin check: stop reason = breakpoint 1.1
10802155232SChris Fallin check: frame #0
10902155232SChris Fallin sameln: JIT
11002155232SChris Fallin sameln: fib(n=3)
11102155232SChris Fallin check: n = 3
11202155232SChris Fallin check: a = 0
11302155232SChris Fallin check: resuming
11402155232SChris Fallin check: exited with status
11502155232SChris Fallin "#,
11602155232SChris Fallin     )?;
11702155232SChris Fallin     Ok(())
11802155232SChris Fallin }
11902155232SChris Fallin 
12002155232SChris Fallin #[test]
12102155232SChris Fallin #[ignore]
dwarf_fib_wasm_dwarf5() -> Result<()>12202155232SChris Fallin pub fn dwarf_fib_wasm_dwarf5() -> Result<()> {
12302155232SChris Fallin     let output = lldb_with_script(
12402155232SChris Fallin         &[
12502155232SChris Fallin             "-Ccache=n",
12602155232SChris Fallin             "-Ddebug-info",
12702155232SChris Fallin             "-Oopt-level=0",
12802155232SChris Fallin             "--invoke",
12902155232SChris Fallin             "fib",
13002155232SChris Fallin             DWARF_FIB_WASM_DWARF5,
13102155232SChris Fallin             "3",
13202155232SChris Fallin         ],
13302155232SChris Fallin         r#"b fib
13402155232SChris Fallin r
13502155232SChris Fallin fr v
13602155232SChris Fallin c"#,
13702155232SChris Fallin     )?;
13802155232SChris Fallin 
13902155232SChris Fallin     check_lldb_output(
14002155232SChris Fallin         &output,
14102155232SChris Fallin         r#"
14202155232SChris Fallin check: Breakpoint 1: no locations (pending)
14302155232SChris Fallin check: Unable to resolve breakpoint to any actual locations.
14402155232SChris Fallin check: 1 location added to breakpoint 1
14502155232SChris Fallin check: stop reason = breakpoint 1.1
14602155232SChris Fallin check: frame #0
14702155232SChris Fallin sameln: JIT
14802155232SChris Fallin sameln: fib(n=3)
14902155232SChris Fallin check: n = 3
15002155232SChris Fallin check: a = 0
15102155232SChris Fallin check: resuming
15202155232SChris Fallin check: exited with status
15302155232SChris Fallin "#,
15402155232SChris Fallin     )?;
15502155232SChris Fallin     Ok(())
15602155232SChris Fallin }
15702155232SChris Fallin 
15802155232SChris Fallin #[test]
15902155232SChris Fallin #[ignore]
dwarf_fib_wasm_split4() -> Result<()>16002155232SChris Fallin pub fn dwarf_fib_wasm_split4() -> Result<()> {
16102155232SChris Fallin     let output = lldb_with_script(
16202155232SChris Fallin         &[
16302155232SChris Fallin             "-Ccache=n",
16402155232SChris Fallin             "-Ddebug-info",
16502155232SChris Fallin             "-Oopt-level=0",
16602155232SChris Fallin             "--invoke",
16702155232SChris Fallin             "fib",
16802155232SChris Fallin             DWARF_FIB_WASM_SPLIT4,
16902155232SChris Fallin             "3",
17002155232SChris Fallin         ],
17102155232SChris Fallin         r#"b fib
17202155232SChris Fallin r
17302155232SChris Fallin fr v
17402155232SChris Fallin c"#,
17502155232SChris Fallin     )?;
17602155232SChris Fallin 
17702155232SChris Fallin     check_lldb_output(
17802155232SChris Fallin         &output,
17902155232SChris Fallin         r#"
18002155232SChris Fallin check: Breakpoint 1: no locations (pending)
18102155232SChris Fallin check: Unable to resolve breakpoint to any actual locations.
18202155232SChris Fallin check: 1 location added to breakpoint 1
18302155232SChris Fallin check: stop reason = breakpoint 1.1
18402155232SChris Fallin check: frame #0
18502155232SChris Fallin sameln: JIT
18602155232SChris Fallin sameln: fib(n=3)
18702155232SChris Fallin check: n = 3
18802155232SChris Fallin check: a = 0
18902155232SChris Fallin check: resuming
19002155232SChris Fallin check: exited with status
19102155232SChris Fallin "#,
19202155232SChris Fallin     )?;
19302155232SChris Fallin     Ok(())
19402155232SChris Fallin }
19502155232SChris Fallin 
19602155232SChris Fallin #[test]
19702155232SChris Fallin #[ignore]
dwarf_generic() -> Result<()>19802155232SChris Fallin pub fn dwarf_generic() -> Result<()> {
19902155232SChris Fallin     let output = lldb_with_script(
20002155232SChris Fallin         &["-Ccache=n", "-Ddebug-info", "-Oopt-level=0", DWARF_GENERIC],
20102155232SChris Fallin         r#"br set -n debug_break -C up
20202155232SChris Fallin r
20302155232SChris Fallin p __vmctx->set()
20402155232SChris Fallin p (x + x)
20502155232SChris Fallin c
20602155232SChris Fallin p (x + x)
20702155232SChris Fallin c
20802155232SChris Fallin p inst.BaseValue + inst.DerivedValue
20902155232SChris Fallin c
21002155232SChris Fallin type lookup DerivedType
21102155232SChris Fallin c
21202155232SChris Fallin p __this->BaseValue + __this->DerivedValue
21302155232SChris Fallin c
21402155232SChris Fallin p __this->BaseValue + __this->DerivedValue
21502155232SChris Fallin c
21602155232SChris Fallin p __this->BaseValue + __this->DerivedValue
21702155232SChris Fallin c
21802155232SChris Fallin f
21902155232SChris Fallin n
22002155232SChris Fallin s
22102155232SChris Fallin v var0
22202155232SChris Fallin v var1
22302155232SChris Fallin c"#,
22402155232SChris Fallin     )?;
22502155232SChris Fallin 
22602155232SChris Fallin     check_lldb_output(
22702155232SChris Fallin         &output,
22802155232SChris Fallin         r#"
22902155232SChris Fallin check: stop reason = breakpoint 1.1
23002155232SChris Fallin check: 2
23102155232SChris Fallin check: stop reason = breakpoint 1.1
23202155232SChris Fallin check: 4
23302155232SChris Fallin check: stop reason = breakpoint 1.1
23402155232SChris Fallin check: 3
23502155232SChris Fallin check: stop reason = breakpoint 1.1
23602155232SChris Fallin check: static int InstanceMethod
23702155232SChris Fallin check: static int ConstInstanceMethod
23802155232SChris Fallin check: stop reason = breakpoint 1.1
23902155232SChris Fallin check: 6
24002155232SChris Fallin check: stop reason = breakpoint 1.1
24102155232SChris Fallin check: 7
24202155232SChris Fallin check: stop reason = breakpoint 1.1
24302155232SChris Fallin check: 8
24402155232SChris Fallin check: stop reason = breakpoint 1.1
24502155232SChris Fallin check: 9
24602155232SChris Fallin check: 10
24702155232SChris Fallin check: exited with status = 0
24802155232SChris Fallin "#,
24902155232SChris Fallin     )?;
25002155232SChris Fallin     Ok(())
25102155232SChris Fallin }
25202155232SChris Fallin 
25302155232SChris Fallin #[test]
25402155232SChris Fallin #[ignore]
dwarf_codegen_optimized() -> Result<()>25502155232SChris Fallin pub fn dwarf_codegen_optimized() -> Result<()> {
25602155232SChris Fallin     let output = lldb_with_script(
25702155232SChris Fallin         &[
25802155232SChris Fallin             "-Ccache=n",
25902155232SChris Fallin             "-Ddebug-info",
26002155232SChris Fallin             "-Oopt-level=2",
26102155232SChris Fallin             DWARF_CODEGEN_OPTIMIZED,
26202155232SChris Fallin         ],
26302155232SChris Fallin         r#"b InitializeTest
26402155232SChris Fallin r
26533224b22SAlex Crichton b dwarf_codegen_optimized.cc:25
26633224b22SAlex Crichton b dwarf_codegen_optimized.cc:26
26702155232SChris Fallin c
26802155232SChris Fallin v x
26902155232SChris Fallin c
27002155232SChris Fallin v x
27102155232SChris Fallin c"#,
27202155232SChris Fallin     )?;
27302155232SChris Fallin 
27402155232SChris Fallin     check_lldb_output(
27502155232SChris Fallin         &output,
27602155232SChris Fallin         r#"
27702155232SChris Fallin check: stop reason = breakpoint 1.1
27802155232SChris Fallin check: stop reason = breakpoint 2.1
27902155232SChris Fallin check: x = 42
28002155232SChris Fallin check: stop reason = breakpoint 3.1
28102155232SChris Fallin check: x = <variable not available>
28202155232SChris Fallin check: exited with status = 0
28302155232SChris Fallin "#,
28402155232SChris Fallin     )?;
28502155232SChris Fallin     Ok(())
28602155232SChris Fallin }
28702155232SChris Fallin 
28802155232SChris Fallin #[test]
28902155232SChris Fallin #[ignore]
dwarf_codegen_optimized_wasm_optimized() -> Result<()>29002155232SChris Fallin pub fn dwarf_codegen_optimized_wasm_optimized() -> Result<()> {
29102155232SChris Fallin     let output = lldb_with_script(
29202155232SChris Fallin         &[
29302155232SChris Fallin             "-Ccache=n",
29402155232SChris Fallin             "-Ddebug-info",
29502155232SChris Fallin             "-Oopt-level=2",
29602155232SChris Fallin             DWARF_CODEGEN_OPTIMIZED_WASM_OPTIMIZED,
29702155232SChris Fallin         ],
29802155232SChris Fallin         r#"b InitializeTest
29902155232SChris Fallin r
30033224b22SAlex Crichton b dwarf_codegen_optimized_wasm_optimized.cc:23
30133224b22SAlex Crichton b dwarf_codegen_optimized_wasm_optimized.cc:29
30202155232SChris Fallin c
30302155232SChris Fallin v b
30402155232SChris Fallin c
30502155232SChris Fallin v b
30602155232SChris Fallin c"#,
30702155232SChris Fallin     )?;
30802155232SChris Fallin 
30902155232SChris Fallin     check_lldb_output(
31002155232SChris Fallin         &output,
31102155232SChris Fallin         r#"
31202155232SChris Fallin check: stop reason = breakpoint 1.1
31302155232SChris Fallin check: stop reason = breakpoint 2.1
31402155232SChris Fallin check: b = 42
31502155232SChris Fallin check: stop reason = breakpoint 3.1
31602155232SChris Fallin check: b = 43
31702155232SChris Fallin check: exited with status = 0
31802155232SChris Fallin "#,
31902155232SChris Fallin     )?;
32002155232SChris Fallin     Ok(())
32102155232SChris Fallin }
32202155232SChris Fallin 
32302155232SChris Fallin #[test]
32402155232SChris Fallin #[ignore]
dwarf_fraction_norm() -> Result<()>32502155232SChris Fallin pub fn dwarf_fraction_norm() -> Result<()> {
32602155232SChris Fallin     let output = lldb_with_script(
32702155232SChris Fallin         &[
32802155232SChris Fallin             "-Ccache=n",
32902155232SChris Fallin             "-Oopt-level=0",
33002155232SChris Fallin             "-Ddebug-info",
33102155232SChris Fallin             DWARF_FRACTION_NORM,
33202155232SChris Fallin         ],
33302155232SChris Fallin         r#"b dwarf_fraction_norm.cc:26
33402155232SChris Fallin r
33502155232SChris Fallin p __vmctx->set(),n->denominator
33602155232SChris Fallin c"#,
33702155232SChris Fallin     )?;
33802155232SChris Fallin 
33902155232SChris Fallin     check_lldb_output(
34002155232SChris Fallin         &output,
34102155232SChris Fallin         r#"
34202155232SChris Fallin check: Breakpoint 1: no locations (pending)
34302155232SChris Fallin check: stop reason = breakpoint 1.1
34402155232SChris Fallin check: frame #0
34502155232SChris Fallin sameln: norm(n=(__ptr =
34602155232SChris Fallin check: 27
34702155232SChris Fallin check: resuming
34802155232SChris Fallin "#,
34902155232SChris Fallin     )?;
35002155232SChris Fallin     Ok(())
35102155232SChris Fallin }
35202155232SChris Fallin 
35302155232SChris Fallin #[test]
35402155232SChris Fallin #[ignore]
dwarf_two_removed_branches() -> Result<()>35502155232SChris Fallin pub fn dwarf_two_removed_branches() -> Result<()> {
35602155232SChris Fallin     let output = lldb_with_script(
35702155232SChris Fallin         &[
35802155232SChris Fallin             "-Ccache=n",
35902155232SChris Fallin             "-Oopt-level=0",
36002155232SChris Fallin             "-Ddebug-info",
36102155232SChris Fallin             DWARF_TWO_REMOVED_BRANCHES,
36202155232SChris Fallin         ],
36302155232SChris Fallin         r#"r"#,
36402155232SChris Fallin     )?;
36502155232SChris Fallin 
36602155232SChris Fallin     // We are simply checking that the output compiles.
36702155232SChris Fallin     check_lldb_output(
36802155232SChris Fallin         &output,
36902155232SChris Fallin         r#"
37002155232SChris Fallin check: exited with status
37102155232SChris Fallin "#,
37202155232SChris Fallin     )?;
37302155232SChris Fallin     Ok(())
37402155232SChris Fallin }
37502155232SChris Fallin 
37602155232SChris Fallin #[test]
37702155232SChris Fallin #[ignore]
dwarf_spilled_frame_base() -> Result<()>37802155232SChris Fallin pub fn dwarf_spilled_frame_base() -> Result<()> {
37902155232SChris Fallin     let output = lldb_with_script(
38002155232SChris Fallin         &[
38102155232SChris Fallin             "-Ccache=n",
38202155232SChris Fallin             "-Oopt-level=0",
38302155232SChris Fallin             "-Ddebug-info",
38402155232SChris Fallin             DWARF_SPILLED_FRAME_BASE,
38502155232SChris Fallin         ],
38602155232SChris Fallin         r#"b dwarf_spilled_frame_base.c:13
38702155232SChris Fallin r
38802155232SChris Fallin fr v i
38902155232SChris Fallin n
39002155232SChris Fallin fr v i
39102155232SChris Fallin n
39202155232SChris Fallin fr v i
39302155232SChris Fallin n
39402155232SChris Fallin fr v i
39502155232SChris Fallin n
39602155232SChris Fallin fr v i
39702155232SChris Fallin n
39802155232SChris Fallin fr v i
39902155232SChris Fallin c
40002155232SChris Fallin "#,
40102155232SChris Fallin     )?;
40202155232SChris Fallin 
40302155232SChris Fallin     // Check that if the frame base (shadow frame pointer) local
40402155232SChris Fallin     // is spilled, we can still read locals that reference it.
40502155232SChris Fallin     check_lldb_output(
40602155232SChris Fallin         &output,
40702155232SChris Fallin         r#"
40802155232SChris Fallin check: i = 0
40902155232SChris Fallin check: i = 1
41002155232SChris Fallin check: i = 1
41102155232SChris Fallin check: i = 1
41202155232SChris Fallin check: i = 1
41302155232SChris Fallin check: i = 1
41402155232SChris Fallin check: exited with status
41502155232SChris Fallin "#,
41602155232SChris Fallin     )?;
41702155232SChris Fallin     Ok(())
41802155232SChris Fallin }
41902155232SChris Fallin 
42002155232SChris Fallin #[test]
42102155232SChris Fallin #[ignore]
dwarf_fission() -> Result<()>42202155232SChris Fallin pub fn dwarf_fission() -> Result<()> {
42302155232SChris Fallin     let output = lldb_with_script(
42402155232SChris Fallin         &["-Ccache=n", "-Ddebug-info", "-Oopt-level=0", DWARF_FISSION],
42502155232SChris Fallin         r#"breakpoint set --file dwarf_fission.c --line 8
42602155232SChris Fallin r
42702155232SChris Fallin fr v
42802155232SChris Fallin s
42902155232SChris Fallin fr v
43002155232SChris Fallin c"#,
43102155232SChris Fallin     )?;
43202155232SChris Fallin 
43302155232SChris Fallin     check_lldb_output(
43402155232SChris Fallin         &output,
43502155232SChris Fallin         r#"
43602155232SChris Fallin check: Breakpoint 1: no locations (pending)
43702155232SChris Fallin check: Unable to resolve breakpoint to any actual locations.
43802155232SChris Fallin check: 1 location added to breakpoint 1
43902155232SChris Fallin check: stop reason = breakpoint 1.1
44002155232SChris Fallin check: i = 1
44102155232SChris Fallin check: stop reason = step in
44202155232SChris Fallin check: i = 2
44302155232SChris Fallin check: resuming
44402155232SChris Fallin check: exited with status = 0
44502155232SChris Fallin "#,
44602155232SChris Fallin     )?;
44702155232SChris Fallin     Ok(())
44802155232SChris Fallin }
44902155232SChris Fallin 
test_dwarf_simple(wasm: &str, extra_args: &[&str]) -> Result<()>45002155232SChris Fallin fn test_dwarf_simple(wasm: &str, extra_args: &[&str]) -> Result<()> {
45102155232SChris Fallin     println!("testing {wasm:?}");
4520a55f804SAlex Crichton     let mut args = vec![
4530a55f804SAlex Crichton         "-Ccache=n",
4540a55f804SAlex Crichton         "-Oopt-level=0",
4550a55f804SAlex Crichton         "-Ddebug-info",
4560a55f804SAlex Crichton         "-Wshared-memory",
4570a55f804SAlex Crichton     ];
45802155232SChris Fallin     args.extend(extra_args);
45902155232SChris Fallin     args.push(wasm);
46002155232SChris Fallin     let output = lldb_with_script(
46102155232SChris Fallin         &args,
46202155232SChris Fallin         r#"
46302155232SChris Fallin breakpoint set --file dwarf_simple.rs --line 3
46402155232SChris Fallin breakpoint set --file dwarf_simple.rs --line 5
46502155232SChris Fallin r
46602155232SChris Fallin fr v
46702155232SChris Fallin c
46802155232SChris Fallin fr v
46902155232SChris Fallin breakpoint disable 2
47002155232SChris Fallin c"#,
47102155232SChris Fallin     )?;
47202155232SChris Fallin 
47302155232SChris Fallin     check_lldb_output(
47402155232SChris Fallin         &output,
47502155232SChris Fallin         r#"
47602155232SChris Fallin check: Breakpoint 1: no locations (pending)
47702155232SChris Fallin check: Unable to resolve breakpoint to any actual locations.
47802155232SChris Fallin check: 1 location added to breakpoint 1
47902155232SChris Fallin check: stop reason = breakpoint 1.1
48002155232SChris Fallin check: dwarf_simple.rs:3
48102155232SChris Fallin check: a = 100
48202155232SChris Fallin check: dwarf_simple.rs:5
48302155232SChris Fallin check: a = 110
48402155232SChris Fallin check: b = 117
48502155232SChris Fallin check: resuming
48602155232SChris Fallin check: exited with status = 0
48702155232SChris Fallin "#,
48802155232SChris Fallin     )?;
48902155232SChris Fallin     Ok(())
49002155232SChris Fallin }
49102155232SChris Fallin 
49202155232SChris Fallin #[test]
49302155232SChris Fallin #[ignore]
dwarf_simple() -> Result<()>49402155232SChris Fallin fn dwarf_simple() -> Result<()> {
49502155232SChris Fallin     for wasm in [DWARF_SIMPLE, DWARF_SIMPLE_COMPONENT] {
49602155232SChris Fallin         test_dwarf_simple(wasm, &[])?;
49702155232SChris Fallin     }
49802155232SChris Fallin     Ok(())
49902155232SChris Fallin }
50002155232SChris Fallin 
50102155232SChris Fallin #[test]
50202155232SChris Fallin #[ignore]
dwarf_imported_memory() -> Result<()>50302155232SChris Fallin fn dwarf_imported_memory() -> Result<()> {
50402155232SChris Fallin     test_dwarf_simple(
50502155232SChris Fallin         DWARF_IMPORTED_MEMORY,
50602155232SChris Fallin         &["--preload=env=./tests/all/native_debug/satisfy_memory_import.wat"],
50702155232SChris Fallin     )
50802155232SChris Fallin }
50902155232SChris Fallin 
51002155232SChris Fallin #[test]
51102155232SChris Fallin #[ignore]
dwarf_shared_memory() -> Result<()>51202155232SChris Fallin fn dwarf_shared_memory() -> Result<()> {
51302155232SChris Fallin     test_dwarf_simple(DWARF_SHARED_MEMORY, &[])
51402155232SChris Fallin }
51502155232SChris Fallin 
51602155232SChris Fallin #[test]
51702155232SChris Fallin #[ignore]
dwarf_multiple_codegen_units() -> Result<()>51802155232SChris Fallin fn dwarf_multiple_codegen_units() -> Result<()> {
51902155232SChris Fallin     for wasm in [
52002155232SChris Fallin         DWARF_MULTIPLE_CODEGEN_UNITS,
52102155232SChris Fallin         DWARF_MULTIPLE_CODEGEN_UNITS_COMPONENT,
52202155232SChris Fallin     ] {
52302155232SChris Fallin         println!("testing {wasm:?}");
52402155232SChris Fallin         let output = lldb_with_script(
52502155232SChris Fallin             &["-Ccache=n", "-Oopt-level=0", "-Ddebug-info", wasm],
52602155232SChris Fallin             r#"
52702155232SChris Fallin breakpoint set --file dwarf_multiple_codegen_units.rs --line 3
52802155232SChris Fallin breakpoint set --file dwarf_multiple_codegen_units.rs --line 10
52902155232SChris Fallin r
53002155232SChris Fallin fr v
53102155232SChris Fallin c
53202155232SChris Fallin fr v
53302155232SChris Fallin breakpoint delete 2
53402155232SChris Fallin finish
53502155232SChris Fallin c"#,
53602155232SChris Fallin         )?;
53702155232SChris Fallin 
53802155232SChris Fallin         check_lldb_output(
53902155232SChris Fallin             &output,
54002155232SChris Fallin             r#"
54102155232SChris Fallin check: Breakpoint 1: no locations (pending)
54202155232SChris Fallin check: Breakpoint 2: no locations (pending)
54302155232SChris Fallin check: stop reason = breakpoint 1.1
54402155232SChris Fallin check: foo::bar(a)
54502155232SChris Fallin check: a = 3
54602155232SChris Fallin check: sum += i
54702155232SChris Fallin check: x = 3
54802155232SChris Fallin check: sum = 0
54902155232SChris Fallin check: 1 breakpoints deleted
55002155232SChris Fallin check: Return value: $(=.*) 3
55102155232SChris Fallin check: exited with status = 0
55202155232SChris Fallin "#,
55302155232SChris Fallin         )?;
55402155232SChris Fallin     }
55502155232SChris Fallin     Ok(())
55602155232SChris Fallin }
557*9fe4cc18SPhilip Craig 
558*9fe4cc18SPhilip Craig #[test]
559*9fe4cc18SPhilip Craig #[ignore]
dwarf_cold_block() -> Result<()>560*9fe4cc18SPhilip Craig pub fn dwarf_cold_block() -> Result<()> {
561*9fe4cc18SPhilip Craig     let output = lldb_with_script(
562*9fe4cc18SPhilip Craig         &[
563*9fe4cc18SPhilip Craig             "-Ccache=n",
564*9fe4cc18SPhilip Craig             "-Oopt-level=0",
565*9fe4cc18SPhilip Craig             "-Ddebug-info",
566*9fe4cc18SPhilip Craig             DWARF_COLD_BLOCK,
567*9fe4cc18SPhilip Craig         ],
568*9fe4cc18SPhilip Craig         r#"b foo
569*9fe4cc18SPhilip Craig r
570*9fe4cc18SPhilip Craig p __vmctx->set(),*f1
571*9fe4cc18SPhilip Craig n
572*9fe4cc18SPhilip Craig p __vmctx->set(),*f1
573*9fe4cc18SPhilip Craig n
574*9fe4cc18SPhilip Craig p __vmctx->set(),*f1
575*9fe4cc18SPhilip Craig n
576*9fe4cc18SPhilip Craig p __vmctx->set(),*f1
577*9fe4cc18SPhilip Craig c"#,
578*9fe4cc18SPhilip Craig     )?;
579*9fe4cc18SPhilip Craig 
580*9fe4cc18SPhilip Craig     check_lldb_output(
581*9fe4cc18SPhilip Craig         &output,
582*9fe4cc18SPhilip Craig         r#"
583*9fe4cc18SPhilip Craig check: Breakpoint 1: no locations (pending)
584*9fe4cc18SPhilip Craig check: stop reason = breakpoint 1.1
585*9fe4cc18SPhilip Craig check: frame #0
586*9fe4cc18SPhilip Craig sameln: foo(f1=(__ptr =
587*9fe4cc18SPhilip Craig check: data = 42
588*9fe4cc18SPhilip Craig check: data = 42
589*9fe4cc18SPhilip Craig check: data = 42
590*9fe4cc18SPhilip Craig check: data = 42
591*9fe4cc18SPhilip Craig check: resuming
592*9fe4cc18SPhilip Craig "#,
593*9fe4cc18SPhilip Craig     )?;
594*9fe4cc18SPhilip Craig     Ok(())
595*9fe4cc18SPhilip Craig }
596