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

View File

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

View File

@ -78,6 +78,11 @@ where
pub fn into_vec(self) -> Vec<V> {
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>

View File

@ -502,17 +502,6 @@ define_map_index![
| 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]
macro_rules! define_local_or_import {
($ty:ident, $local_ty:ident, $imported_ty:ident, $imports:ident) => {