1
0
mirror of https://github.com/fluencelabs/wasmer synced 2025-03-31 15:01:03 +00:00

Add command line flag, make debug crate optional, clean up API

This commit is contained in:
Mark McCaskey 2020-02-14 12:34:25 -08:00
parent e34e0bb897
commit 923e4ac83a
8 changed files with 52 additions and 54 deletions
Cargo.lockCargo.toml
lib
clif-backend/src
runtime-core
src/bin

1
Cargo.lock generated

@ -1949,7 +1949,6 @@ dependencies = [
"bincode", "bincode",
"blake3", "blake3",
"cc", "cc",
"cranelift-entity",
"digest", "digest",
"errno", "errno",
"hex", "hex",

@ -79,7 +79,7 @@ serde = { version = "1", features = ["derive"] } # used by the plugin example
typetag = "0.1" # used by the plugin example typetag = "0.1" # used by the plugin example
[features] [features]
default = ["fast-tests", "wasi", "backend-cranelift", "wabt"] default = ["fast-tests", "wasi", "backend-cranelift", "wabt", "wasmer-runtime-core/generate-debug-information"]
"loader-kernel" = ["wasmer-kernel-loader"] "loader-kernel" = ["wasmer-kernel-loader"]
debug = ["fern", "log/max_level_debug", "log/release_max_level_debug"] debug = ["fern", "log/max_level_debug", "log/release_max_level_debug"]
trace = ["fern", "log/max_level_trace", "log/release_max_level_trace"] trace = ["fern", "log/max_level_trace", "log/release_max_level_trace"]

@ -11,7 +11,6 @@ use crate::{
use byteorder::{ByteOrder, LittleEndian}; use byteorder::{ByteOrder, LittleEndian};
use cranelift_codegen::{ use cranelift_codegen::{
binemit::{Stackmap, StackmapSink}, binemit::{Stackmap, StackmapSink},
entity::PrimaryMap,
ir, isa, Context, ValueLabelsRanges, ir, isa, Context, ValueLabelsRanges,
}; };
use rayon::prelude::*; use rayon::prelude::*;
@ -199,10 +198,10 @@ impl FuncResolverBuilder {
use wasm_debug::types::CompiledFunctionData; use wasm_debug::types::CompiledFunctionData;
let mut debug_metadata = if generate_debug_info { let mut debug_metadata = if generate_debug_info {
Some(wasmer_runtime_core::codegen::DebugMetadata { Some(wasmer_runtime_core::codegen::DebugMetadata {
func_info: PrimaryMap::new(), func_info: Map::new(),
inst_info: PrimaryMap::new(), inst_info: Map::new(),
pointers: vec![], pointers: vec![],
stack_slot_offsets: PrimaryMap::new(), stack_slot_offsets: Map::new(),
}) })
} else { } else {
None None

@ -20,10 +20,7 @@ libc = "0.2.60"
hex = "0.4" hex = "0.4"
smallvec = "0.6" smallvec = "0.6"
bincode = "1.1" bincode = "1.1"
# todo: review wasm-debug = { optional = true, version = "0.1.0", path = "../../../Dev/wasm-debug" }
cranelift-entity = "0.52"
# todo, make optional, etc
wasm-debug = { version = "0.1.0", path = "../../../Dev/wasm-debug" }
target-lexicon = "0.9" target-lexicon = "0.9"
[dependencies.indexmap] [dependencies.indexmap]
@ -57,3 +54,5 @@ cc = "1.0"
[features] [features]
managed = [] managed = []
deterministic-execution = ["wasmparser/deterministic"] deterministic-execution = ["wasmparser/deterministic"]
# generate debug information from Wasm DWARF for use with the GDB JIT interface
generate-debug-information = ["wasm-debug"]

@ -18,6 +18,7 @@ use std::fmt;
use std::fmt::Debug; use std::fmt::Debug;
use std::marker::PhantomData; use std::marker::PhantomData;
use std::sync::{Arc, RwLock}; use std::sync::{Arc, RwLock};
use wasm_debug::types::{CompiledFunctionData, ValueLabelsRangesInner};
use wasmparser::{self, WasmDecoder}; use wasmparser::{self, WasmDecoder};
use wasmparser::{Operator, Type as WpType}; use wasmparser::{Operator, Type as WpType};
@ -127,15 +128,14 @@ pub trait ModuleCodeGenerator<FCG: FunctionCodeGenerator<E>, RM: RunnableModule,
unsafe fn from_cache(cache: Artifact, _: Token) -> Result<ModuleInner, CacheError>; unsafe fn from_cache(cache: Artifact, _: Token) -> Result<ModuleInner, CacheError>;
} }
use cranelift_entity::PrimaryMap;
/// missing documentation! /// missing documentation!
pub struct DebugMetadata { pub struct DebugMetadata {
///f unc info /// [`CompiledFunctionData`] in [`FuncIndex`] order
pub func_info: PrimaryMap<FuncIndex, wasm_debug::types::CompiledFunctionData>, pub func_info: Map<FuncIndex, CompiledFunctionData>,
/// inst_info /// [`ValueLabelsRangesInner`] in [`FuncIndex`] order
pub inst_info: PrimaryMap<FuncIndex, wasm_debug::types::ValueLabelsRangesInner>, pub inst_info: Map<FuncIndex, ValueLabelsRangesInner>,
/// stack slot offsets! /// Stack slot offsets in [`FuncIndex`] order
pub stack_slot_offsets: PrimaryMap<FuncIndex, Vec<Option<i32>>>, pub stack_slot_offsets: Map<FuncIndex, Vec<Option<i32>>>,
/// function pointers and their lengths /// function pointers and their lengths
pub pointers: Vec<(*const u8, usize)>, pub pointers: Vec<(*const u8, usize)>,
} }
@ -280,34 +280,36 @@ impl<
}; };
if compiler_config.generate_debug_info { if compiler_config.generate_debug_info {
let debug_metadata = debug_metadata.expect("debug metadata"); if let Some(debug_metadata) = debug_metadata {
let debug_info = wasm_debug::read_debuginfo(wasm); let debug_info = wasm_debug::read_debuginfo(wasm);
let extra_info = wasm_debug::types::ModuleVmctxInfo::new( let extra_info = wasm_debug::types::ModuleVmctxInfo::new(
14 * 8, 14 * 8,
debug_metadata.stack_slot_offsets.values(), debug_metadata.stack_slot_offsets.values(),
); );
// lazy type hack (TODO:) let compiled_fn_map =
let compiled_fn_map = wasm_debug::types::create_module_address_map(debug_metadata.func_info.values());
wasm_debug::types::create_module_address_map(debug_metadata.func_info.values()); let range_map =
let range_map = wasm_debug::types::build_values_ranges(debug_metadata.inst_info.values());
wasm_debug::types::build_values_ranges(debug_metadata.inst_info.values()); let raw_func_slice = debug_metadata.pointers;
let raw_func_slice = debug_metadata.pointers;
let debug_image = wasm_debug::emit_debugsections_image( let debug_image = wasm_debug::emit_debugsections_image(
X86_64_OSX, X86_64_OSX,
std::mem::size_of::<usize>() as u8, std::mem::size_of::<usize>() as u8,
&debug_info, &debug_info,
&extra_info, &extra_info,
&compiled_fn_map, &compiled_fn_map,
&range_map, &range_map,
&raw_func_slice, &raw_func_slice,
) )
.expect("make debug image"); .expect("make debug image");
crate::jit_debug::register_new_jit_code_entry( crate::jit_debug::register_new_jit_code_entry(
&debug_image, &debug_image,
crate::jit_debug::JITAction::JIT_REGISTER_FN, crate::jit_debug::JITAction::JIT_REGISTER_FN,
); );
} else {
eprintln!("Failed to generate debug information!");
}
} }
Ok(ModuleInner { Ok(ModuleInner {
cache_gen, cache_gen,

@ -78,6 +78,11 @@ where
pub fn into_vec(self) -> Vec<V> { pub fn into_vec(self) -> Vec<V> {
self.elems self.elems
} }
/// Iterate over the values of the map in order
pub fn values(&self) -> impl Iterator<Item = &V> {
self.elems.iter()
}
} }
impl<K, V> Map<K, V> impl<K, V> Map<K, V>

@ -502,17 +502,6 @@ define_map_index![
| imported: ImportedFuncIndex, ImportedMemoryIndex, ImportedTableIndex, ImportedGlobalIndex, | imported: ImportedFuncIndex, ImportedMemoryIndex, ImportedTableIndex, ImportedGlobalIndex,
]; ];
// lol
impl cranelift_entity::EntityRef for FuncIndex {
fn index(self) -> usize {
self.0 as usize
}
fn new(x: usize) -> Self {
Self(x as u32)
}
}
#[rustfmt::skip] #[rustfmt::skip]
macro_rules! define_local_or_import { macro_rules! define_local_or_import {
($ty:ident, $local_ty:ident, $imported_ty:ident, $imports:ident) => { ($ty:ident, $local_ty:ident, $imported_ty:ident, $imports:ident) => {

@ -567,6 +567,10 @@ impl LLVMCallbacks for LLVMCLIOptions {
/// Execute a wasm/wat file /// Execute a wasm/wat file
fn execute_wasm(options: &Run) -> Result<(), String> { fn execute_wasm(options: &Run) -> Result<(), String> {
if options.generate_debug_info && options.backend != Backend::Cranelift {
return Err("Generating debug information is currently only available with the `cranelift` backend.".to_owned());
}
let disable_cache = options.disable_cache; let disable_cache = options.disable_cache;
let mapped_dirs = get_mapped_dirs(&options.mapped_dirs[..])?; let mapped_dirs = get_mapped_dirs(&options.mapped_dirs[..])?;
@ -1021,6 +1025,7 @@ fn get_backend(backend: Backend, path: &PathBuf) -> Backend {
fn run(options: &mut Run) { fn run(options: &mut Run) {
options.backend = get_backend(options.backend, &options.path); options.backend = get_backend(options.backend, &options.path);
#[cfg(any(feature = "debug", feature = "trace"))] #[cfg(any(feature = "debug", feature = "trace"))]
{ {
if options.debug { if options.debug {