Merge branch 'master' into feature/debug-prototype2

This commit is contained in:
Mark McCaskey
2020-02-26 14:39:02 -08:00
56 changed files with 1419 additions and 368 deletions

View File

@ -1,6 +1,6 @@
[package]
name = "wasmer-clif-backend"
version = "0.14.0"
version = "0.14.1"
description = "Wasmer runtime Cranelift compiler backend"
license = "MIT"
authors = ["The Wasmer Engineering Team <engineering@wasmer.io>"]
@ -11,14 +11,14 @@ edition = "2018"
readme = "README.md"
[dependencies]
wasmer-runtime-core = { path = "../runtime-core", version = "0.14.0" }
cranelift-native = "0.52.0"
cranelift-codegen = "0.52.0"
cranelift-entity = "0.52.0"
cranelift-frontend = { package = "wasmer-clif-fork-frontend", version = "0.52.0" }
cranelift-wasm = { package = "wasmer-clif-fork-wasm", version = "0.52.0" }
target-lexicon = "0.9"
wasmparser = "0.45.0"
wasmer-runtime-core = { path = "../runtime-core", version = "0.14.1" }
cranelift-native = "0.59.0"
cranelift-codegen = "0.59.0"
cranelift-entity = "0.59.0"
cranelift-frontend = { package = "wasmer-clif-fork-frontend", version = "0.59.0" }
cranelift-wasm = { package = "wasmer-clif-fork-wasm", version = "0.59.0" }
target-lexicon = "0.10"
wasmparser = "0.51.3"
byteorder = "1.3.2"
nix = "0.15.0"
libc = "0.2.60"
@ -38,7 +38,7 @@ version = "0.0.7"
[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["errhandlingapi", "minwindef", "minwinbase", "winnt"] }
wasmer-win-exception-handler = { path = "../win-exception-handler", version = "0.14.0" }
wasmer-win-exception-handler = { path = "../win-exception-handler", version = "0.14.1" }
[features]
generate-debug-information = ["wasm-debug"]

View File

@ -1,6 +1,6 @@
<p align="center">
<a href="https://wasmer.io" target="_blank" rel="noopener noreferrer">
<img width="300" src="https://raw.githubusercontent.com/wasmerio/wasmer/master/logo.png" alt="Wasmer logo">
<img width="300" src="https://raw.githubusercontent.com/wasmerio/wasmer/master/assets/logo.png" alt="Wasmer logo">
</a>
</p>

View File

@ -7,13 +7,14 @@ use crate::{
};
use cranelift_codegen::entity::EntityRef;
use cranelift_codegen::ir::{self, Ebb, Function, InstBuilder};
use cranelift_codegen::ir::{self, Block, Function, InstBuilder};
use cranelift_codegen::isa::CallConv;
use cranelift_codegen::{cursor::FuncCursor, isa};
use cranelift_frontend::{FunctionBuilder, Position, Variable};
use cranelift_wasm::{self, FuncTranslator, ModuleTranslationState};
use cranelift_wasm::{get_vmctx_value_label, translate_operator};
use cranelift_wasm::{FuncEnvironment, ReturnMode, TargetEnvironment, WasmError};
use std::mem;
use std::sync::{Arc, RwLock};
use wasmer_runtime_core::error::CompileError;
@ -110,7 +111,7 @@ impl ModuleCodeGenerator<CraneliftFunctionCodeGenerator, Caller, CodegenError>
func_env.func.collect_debug_info();
}
debug_assert_eq!(func_env.func.dfg.num_ebbs(), 0, "Function must be empty");
debug_assert_eq!(func_env.func.dfg.num_blocks(), 0, "Function must be empty");
debug_assert_eq!(func_env.func.dfg.num_insts(), 0, "Function must be empty");
let mut builder = FunctionBuilder::new(
@ -121,20 +122,20 @@ impl ModuleCodeGenerator<CraneliftFunctionCodeGenerator, Caller, CodegenError>
builder.set_srcloc(ir::SourceLoc::new(loc.start()));
let entry_block = builder.create_ebb();
builder.append_ebb_params_for_function_params(entry_block);
let entry_block = builder.create_block();
builder.append_block_params_for_function_params(entry_block);
builder.switch_to_block(entry_block); // This also creates values for the arguments.
builder.seal_block(entry_block);
// Make sure the entry block is inserted in the layout before we make any callbacks to
// `environ`. The callback functions may need to insert things in the entry block.
builder.ensure_inserted_ebb();
builder.ensure_inserted_block();
declare_wasm_parameters(&mut builder, entry_block);
// Set up the translation state with a single pushed control block representing the whole
// function and its return values.
let exit_block = builder.create_ebb();
builder.append_ebb_params_for_function_returns(exit_block);
let exit_block = builder.create_block();
builder.append_block_params_for_function_returns(exit_block);
func_env
.func_translator
.state
@ -1021,7 +1022,7 @@ impl FuncEnvironment for FunctionEnvironment {
_src: ir::Value,
_len: ir::Value,
) -> cranelift_wasm::WasmResult<()> {
unimplemented!("table.copy yet implemented");
unimplemented!("table.copy not yet implemented");
}
fn translate_table_init(
@ -1034,7 +1035,7 @@ impl FuncEnvironment for FunctionEnvironment {
_src: ir::Value,
_len: ir::Value,
) -> cranelift_wasm::WasmResult<()> {
unimplemented!("table.init yet implemented");
unimplemented!("table.init not yet implemented");
}
fn translate_elem_drop(
@ -1042,7 +1043,72 @@ impl FuncEnvironment for FunctionEnvironment {
_pos: FuncCursor,
_seg_index: u32,
) -> cranelift_wasm::WasmResult<()> {
unimplemented!("elem.drop yet implemented");
unimplemented!("elem.drop not yet implemented");
}
fn translate_table_grow(
&mut self,
_pos: FuncCursor,
_table_index: u32,
_delta: ir::Value,
_init_value: ir::Value,
) -> cranelift_wasm::WasmResult<ir::Value> {
unimplemented!("table.grow not yet implemented");
}
fn translate_table_get(
&mut self,
_pos: FuncCursor,
_table_index: u32,
_index: ir::Value,
) -> cranelift_wasm::WasmResult<ir::Value> {
unimplemented!("table.get not yet implemented");
}
fn translate_table_set(
&mut self,
_pos: FuncCursor,
_table_index: u32,
_value: ir::Value,
_index: ir::Value,
) -> cranelift_wasm::WasmResult<()> {
unimplemented!("table.set not yet implemented");
}
fn translate_table_fill(
&mut self,
_pos: FuncCursor,
_table_index: u32,
_dst: ir::Value,
_val: ir::Value,
_len: ir::Value,
) -> cranelift_wasm::WasmResult<()> {
unimplemented!("table.fill not yet implemented");
}
fn translate_ref_func(
&mut self,
_pos: FuncCursor,
_func_index: u32,
) -> cranelift_wasm::WasmResult<ir::Value> {
unimplemented!("ref.func not yet implemented");
}
fn translate_custom_global_get(
&mut self,
_pos: FuncCursor,
_global_index: cranelift_wasm::GlobalIndex,
) -> cranelift_wasm::WasmResult<ir::Value> {
unimplemented!("custom global.get not yet implemented");
}
fn translate_custom_global_set(
&mut self,
_pos: FuncCursor,
_global_index: cranelift_wasm::GlobalIndex,
_val: ir::Value,
) -> cranelift_wasm::WasmResult<()> {
unimplemented!("custom global.set not yet implemented");
}
}
@ -1242,7 +1308,7 @@ fn pointer_type(mcg: &CraneliftModuleCodeGenerator) -> ir::Type {
/// Declare local variables for the signature parameters that correspond to WebAssembly locals.
///
/// Return the number of local variables declared.
fn declare_wasm_parameters(builder: &mut FunctionBuilder, entry_block: Ebb) -> usize {
fn declare_wasm_parameters(builder: &mut FunctionBuilder, entry_block: Block) -> usize {
let sig_len = builder.func.signature.params.len();
let mut next_local = 0;
for i in 0..sig_len {
@ -1255,11 +1321,11 @@ fn declare_wasm_parameters(builder: &mut FunctionBuilder, entry_block: Ebb) -> u
builder.declare_var(local, param_type.value_type);
next_local += 1;
let param_value = builder.ebb_params(entry_block)[i];
let param_value = builder.block_params(entry_block)[i];
builder.def_var(local, param_value);
}
if param_type.purpose == ir::ArgumentPurpose::VMContext {
let param_value = builder.ebb_params(entry_block)[i];
let param_value = builder.block_params(entry_block)[i];
builder.set_val_label(param_value, get_vmctx_value_label());
}
}

View File

@ -40,7 +40,7 @@ fn get_isa() -> Box<dyn isa::TargetIsa> {
let flags = {
let mut builder = settings::builder();
builder.set("opt_level", "speed_and_size").unwrap();
builder.set("jump_tables_enabled", "false").unwrap();
builder.set("enable_jump_tables", "false").unwrap();
if cfg!(test) || cfg!(debug_assertions) {
builder.set("enable_verifier", "true").unwrap();

View File

@ -98,7 +98,7 @@ pub struct RelocSink {
}
impl binemit::RelocSink for RelocSink {
fn reloc_ebb(
fn reloc_block(
&mut self,
_offset: binemit::CodeOffset,
_reloc: binemit::Reloc,

View File

@ -159,12 +159,12 @@ impl FuncResolverBuilder {
let debug_entry = if generate_debug_info {
let func = &ctx.func;
let encinfo = isa.encoding_info();
let mut ebbs = func.layout.ebbs().collect::<Vec<_>>();
ebbs.sort_by_key(|ebb| func.offsets[*ebb]);
let instructions = ebbs
let mut blocks = func.layout.blocks().collect::<Vec<_>>();
blocks.sort_by_key(|block| func.offsets[*block]);
let instructions = blocks
.into_iter()
.flat_map(|ebb| {
func.inst_offsets(ebb, &encinfo)
.flat_map(|block| {
func.inst_offsets(block, &encinfo)
.map(|(offset, inst, length)| {
let srcloc = func.srclocs[inst];
let val = srcloc.bits();

View File

@ -16,7 +16,7 @@ use wasmer_runtime_core::{
struct NullRelocSink {}
impl RelocSink for NullRelocSink {
fn reloc_ebb(&mut self, _: u32, _: Reloc, _: u32) {}
fn reloc_block(&mut self, _: u32, _: Reloc, _: u32) {}
fn reloc_external(&mut self, _: u32, _: Reloc, _: &ir::ExternalName, _: i64) {}
fn reloc_constant(&mut self, _: u32, _: Reloc, _: u32) {
@ -158,12 +158,12 @@ fn generate_func(func_sig: &FuncSig) -> ir::Function {
let export_sig_ref = func.import_signature(generate_export_signature(func_sig));
let entry_ebb = func.dfg.make_ebb();
let vmctx_ptr = func.dfg.append_ebb_param(entry_ebb, ir::types::I64);
let func_ptr = func.dfg.append_ebb_param(entry_ebb, ir::types::I64);
let args_ptr = func.dfg.append_ebb_param(entry_ebb, ir::types::I64);
let returns_ptr = func.dfg.append_ebb_param(entry_ebb, ir::types::I64);
func.layout.append_ebb(entry_ebb);
let entry_ebb = func.dfg.make_block();
let vmctx_ptr = func.dfg.append_block_param(entry_ebb, ir::types::I64);
let func_ptr = func.dfg.append_block_param(entry_ebb, ir::types::I64);
let args_ptr = func.dfg.append_block_param(entry_ebb, ir::types::I64);
let returns_ptr = func.dfg.append_block_param(entry_ebb, ir::types::I64);
func.layout.append_block(entry_ebb);
let mut pos = FuncCursor::new(&mut func).at_first_insertion_point(entry_ebb);