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:
parent
e34e0bb897
commit
923e4ac83a
1
Cargo.lock
generated
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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user