From 7ce10191df88132b79961e66ec4a1de9c749ac4b Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Mon, 9 Mar 2020 08:06:13 -0500 Subject: [PATCH] Add lldb smoke test (#1241) * add lldb runner * don't build wasmtime * use brew's lldb * disable for macos * set LLDB on linux * re-org gh actions and cfg * address feedback --- .../actions/define-dwarfdump-env/README.md | 3 - .github/actions/define-llvm-env/README.md | 3 + .../action.yml | 0 .../main.js | 2 + .github/workflows/main.yml | 3 +- tests/debug/lldb.rs | 94 +++++++++++++++++++ tests/debug/main.rs | 1 + 7 files changed, 102 insertions(+), 4 deletions(-) delete mode 100644 .github/actions/define-dwarfdump-env/README.md create mode 100644 .github/actions/define-llvm-env/README.md rename .github/actions/{define-dwarfdump-env => define-llvm-env}/action.yml (100%) rename .github/actions/{define-dwarfdump-env => define-llvm-env}/main.js (73%) create mode 100644 tests/debug/lldb.rs diff --git a/.github/actions/define-dwarfdump-env/README.md b/.github/actions/define-dwarfdump-env/README.md deleted file mode 100644 index 035ac379a1..0000000000 --- a/.github/actions/define-dwarfdump-env/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# define-dwarfdump-env - -Defines `DWARFDUMP` path executable. diff --git a/.github/actions/define-llvm-env/README.md b/.github/actions/define-llvm-env/README.md new file mode 100644 index 0000000000..3a9f5fc8ec --- /dev/null +++ b/.github/actions/define-llvm-env/README.md @@ -0,0 +1,3 @@ +# define-llvm-env + +Defines `DWARFDUMP` and `LLDB` path executable. diff --git a/.github/actions/define-dwarfdump-env/action.yml b/.github/actions/define-llvm-env/action.yml similarity index 100% rename from .github/actions/define-dwarfdump-env/action.yml rename to .github/actions/define-llvm-env/action.yml diff --git a/.github/actions/define-dwarfdump-env/main.js b/.github/actions/define-llvm-env/main.js similarity index 73% rename from .github/actions/define-dwarfdump-env/main.js rename to .github/actions/define-llvm-env/main.js index cddcc7f552..7aa100113e 100755 --- a/.github/actions/define-dwarfdump-env/main.js +++ b/.github/actions/define-llvm-env/main.js @@ -3,9 +3,11 @@ // On OSX pointing to brew's LLVM location. if (process.platform == 'darwin') { console.log("::set-env name=DWARFDUMP::/usr/local/opt/llvm/bin/llvm-dwarfdump"); + console.log("::set-env name=LLDB::/usr/local/opt/llvm/bin/lldb"); } // On Linux pointing to specific version if (process.platform == 'linux') { console.log("::set-env name=DWARFDUMP::/usr/bin/llvm-dwarfdump-9"); + console.log("::set-env name=LLDB::/usr/bin/lldb-9"); } diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index aa16e16a76..584e057bfc 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -164,7 +164,7 @@ jobs: - uses: ./.github/actions/install-rust with: toolchain: ${{ matrix.rust }} - - uses: ./.github/actions/define-dwarfdump-env + - uses: ./.github/actions/define-llvm-env - name: Install libclang # Note: libclang is pre-installed on the macOS and linux images. @@ -202,6 +202,7 @@ jobs: # Test debug (DWARF) related functionality. - run: cargo test test_debug_dwarf_ -- --ignored --nocapture --test-threads 1 + if: matrix.os == 'ubuntu-latest' env: RUST_BACKTRACE: 1 RUSTFLAGS: "-D warnings" diff --git a/tests/debug/lldb.rs b/tests/debug/lldb.rs new file mode 100644 index 0000000000..5c7ba9f978 --- /dev/null +++ b/tests/debug/lldb.rs @@ -0,0 +1,94 @@ +#![allow(dead_code)] + +use anyhow::{bail, format_err, Result}; +use filecheck::{CheckerBuilder, NO_VARIABLES}; +use std::env; +use std::io::Write; +use std::process::Command; +use tempfile::NamedTempFile; + +fn lldb_with_script(args: &[&str], script: &str) -> Result { + let lldb_path = env::var("LLDB").unwrap_or("lldb".to_string()); + let mut cmd = Command::new(&lldb_path); + + cmd.arg("--batch"); + if cfg!(target_os = "macos") { + cmd.args(&["-o", "settings set plugin.jit-loader.gdb.enable on"]); + } + let mut script_file = NamedTempFile::new()?; + script_file.write(script.as_bytes())?; + let script_path = script_file.path().to_str().unwrap(); + cmd.args(&["-s", &script_path]); + + let mut me = std::env::current_exe().expect("current_exe specified"); + me.pop(); // chop off the file name + me.pop(); // chop off `deps` + me.push("wasmtime"); + cmd.arg(me); + + cmd.arg("--"); + cmd.args(args); + + let output = cmd.output().expect("success"); + if !output.status.success() { + bail!( + "failed to execute {:?}: {}", + cmd, + String::from_utf8_lossy(&output.stderr), + ); + } + Ok(String::from_utf8(output.stdout)?) +} + +fn check_lldb_output(output: &str, directives: &str) -> Result<()> { + let mut builder = CheckerBuilder::new(); + builder + .text(directives) + .map_err(|e| format_err!("unable to build checker: {:?}", e))?; + let checker = builder.finish(); + let check = checker + .explain(output, NO_VARIABLES) + .map_err(|e| format_err!("{:?}", e))?; + assert!(check.0, "didn't pass check {}", check.1); + Ok(()) +} + +#[test] +#[ignore] +#[cfg(all( + any(target_os = "linux", target_os = "macos"), + target_pointer_width = "64" +))] +pub fn test_debug_dwarf_lldb() -> Result<()> { + let output = lldb_with_script( + &[ + "-g", + "tests/debug/testsuite/fib-wasm.wasm", + "--invoke", + "fib", + "3", + ], + r#"b fib +r +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: frame #0 +sameln: JIT +sameln: fib(n=3) +check: n = 3 +check: a = 0 +check: resuming +check: exited with status +"#, + )?; + Ok(()) +} diff --git a/tests/debug/main.rs b/tests/debug/main.rs index 2365f72022..6b36ba855d 100644 --- a/tests/debug/main.rs +++ b/tests/debug/main.rs @@ -1,4 +1,5 @@ mod dump; +mod lldb; mod obj; mod simulate; mod translate;