Add a compilation section to disable address maps (#3598)
* Add a compilation section to disable address maps This commit adds a new `Config::generate_address_map` compilation setting which is used to disable emission of the `.wasmtime.addrmap` section of compiled artifacts. This section is currently around the size of the entire `.text` section itself unfortunately and for size reasons may wish to be omitted. Functionality-wise all that is lost is knowing the precise wasm module offset address of a faulting instruction or in a backtrace of instructions. This also means that if the module has DWARF debugging information available with it Wasmtime isn't able to produce a filename and line number in the backtrace. This option remains enabled by default. This option may not be needed in the future with #3547 perhaps, but in the meantime it seems reasonable enough to support a configuration mode where the section is entirely omitted if the smallest module possible is desired. * Fix some CI issues * Update tests/all/traps.rs Co-authored-by: Nick Fitzgerald <fitzgen@gmail.com> * Do less work in compilation for address maps But only when disabled Co-authored-by: Nick Fitzgerald <fitzgen@gmail.com>
This commit is contained in:
@@ -54,13 +54,13 @@ fn test_trap_trace() -> Result<()> {
|
||||
assert_eq!(trace[0].module_name().unwrap(), "hello_mod");
|
||||
assert_eq!(trace[0].func_index(), 1);
|
||||
assert_eq!(trace[0].func_name(), Some("hello"));
|
||||
assert_eq!(trace[0].func_offset(), 1);
|
||||
assert_eq!(trace[0].module_offset(), 0x26);
|
||||
assert_eq!(trace[0].func_offset(), Some(1));
|
||||
assert_eq!(trace[0].module_offset(), Some(0x26));
|
||||
assert_eq!(trace[1].module_name().unwrap(), "hello_mod");
|
||||
assert_eq!(trace[1].func_index(), 0);
|
||||
assert_eq!(trace[1].func_name(), None);
|
||||
assert_eq!(trace[1].func_offset(), 1);
|
||||
assert_eq!(trace[1].module_offset(), 0x21);
|
||||
assert_eq!(trace[1].func_offset(), Some(1));
|
||||
assert_eq!(trace[1].module_offset(), Some(0x21));
|
||||
assert!(
|
||||
e.to_string().contains("unreachable"),
|
||||
"wrong message: {}",
|
||||
@@ -637,3 +637,37 @@ fn multithreaded_traps() -> Result<()> {
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(all(target_os = "macos", target_arch = "aarch64"), ignore)] // TODO #2808 system libunwind is broken on aarch64
|
||||
fn traps_without_address_map() -> Result<()> {
|
||||
let mut config = Config::new();
|
||||
config.generate_address_map(false);
|
||||
let engine = Engine::new(&config)?;
|
||||
let mut store = Store::new(&engine, ());
|
||||
let wat = r#"
|
||||
(module $hello_mod
|
||||
(func (export "run") (call $hello))
|
||||
(func $hello (unreachable))
|
||||
)
|
||||
"#;
|
||||
|
||||
let module = Module::new(store.engine(), wat)?;
|
||||
let instance = Instance::new(&mut store, &module, &[])?;
|
||||
let run_func = instance.get_typed_func::<(), (), _>(&mut store, "run")?;
|
||||
|
||||
let e = run_func
|
||||
.call(&mut store, ())
|
||||
.err()
|
||||
.expect("error calling function");
|
||||
|
||||
let trace = e.trace();
|
||||
assert_eq!(trace.len(), 2);
|
||||
assert_eq!(trace[0].func_name(), Some("hello"));
|
||||
assert_eq!(trace[0].func_index(), 1);
|
||||
assert_eq!(trace[0].module_offset(), None);
|
||||
assert_eq!(trace[1].func_name(), None);
|
||||
assert_eq!(trace[1].func_index(), 0);
|
||||
assert_eq!(trace[1].module_offset(), None);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user