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
This commit is contained in:
@@ -1,3 +0,0 @@
|
|||||||
# define-dwarfdump-env
|
|
||||||
|
|
||||||
Defines `DWARFDUMP` path executable.
|
|
||||||
3
.github/actions/define-llvm-env/README.md
vendored
Normal file
3
.github/actions/define-llvm-env/README.md
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# define-llvm-env
|
||||||
|
|
||||||
|
Defines `DWARFDUMP` and `LLDB` path executable.
|
||||||
@@ -3,9 +3,11 @@
|
|||||||
// On OSX pointing to brew's LLVM location.
|
// On OSX pointing to brew's LLVM location.
|
||||||
if (process.platform == 'darwin') {
|
if (process.platform == 'darwin') {
|
||||||
console.log("::set-env name=DWARFDUMP::/usr/local/opt/llvm/bin/llvm-dwarfdump");
|
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
|
// On Linux pointing to specific version
|
||||||
if (process.platform == 'linux') {
|
if (process.platform == 'linux') {
|
||||||
console.log("::set-env name=DWARFDUMP::/usr/bin/llvm-dwarfdump-9");
|
console.log("::set-env name=DWARFDUMP::/usr/bin/llvm-dwarfdump-9");
|
||||||
|
console.log("::set-env name=LLDB::/usr/bin/lldb-9");
|
||||||
}
|
}
|
||||||
3
.github/workflows/main.yml
vendored
3
.github/workflows/main.yml
vendored
@@ -164,7 +164,7 @@ jobs:
|
|||||||
- uses: ./.github/actions/install-rust
|
- uses: ./.github/actions/install-rust
|
||||||
with:
|
with:
|
||||||
toolchain: ${{ matrix.rust }}
|
toolchain: ${{ matrix.rust }}
|
||||||
- uses: ./.github/actions/define-dwarfdump-env
|
- uses: ./.github/actions/define-llvm-env
|
||||||
|
|
||||||
- name: Install libclang
|
- name: Install libclang
|
||||||
# Note: libclang is pre-installed on the macOS and linux images.
|
# Note: libclang is pre-installed on the macOS and linux images.
|
||||||
@@ -202,6 +202,7 @@ jobs:
|
|||||||
|
|
||||||
# Test debug (DWARF) related functionality.
|
# Test debug (DWARF) related functionality.
|
||||||
- run: cargo test test_debug_dwarf_ -- --ignored --nocapture --test-threads 1
|
- run: cargo test test_debug_dwarf_ -- --ignored --nocapture --test-threads 1
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
env:
|
env:
|
||||||
RUST_BACKTRACE: 1
|
RUST_BACKTRACE: 1
|
||||||
RUSTFLAGS: "-D warnings"
|
RUSTFLAGS: "-D warnings"
|
||||||
|
|||||||
94
tests/debug/lldb.rs
Normal file
94
tests/debug/lldb.rs
Normal file
@@ -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<String> {
|
||||||
|
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(())
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
mod dump;
|
mod dump;
|
||||||
|
mod lldb;
|
||||||
mod obj;
|
mod obj;
|
||||||
mod simulate;
|
mod simulate;
|
||||||
mod translate;
|
mod translate;
|
||||||
|
|||||||
Reference in New Issue
Block a user