Simplify ModuleEnvironment.
Remove some unneeded functions, and remove the `GlobalInit` special case for data and elem initializer offsets; implementations that want that information can provide it for themselves.
This commit is contained in:
@@ -7,18 +7,16 @@
|
|||||||
allow(too_many_arguments, cyclomatic_complexity)
|
allow(too_many_arguments, cyclomatic_complexity)
|
||||||
)]
|
)]
|
||||||
|
|
||||||
|
use crate::utils::{parse_sets_and_triple, read_to_end};
|
||||||
use cranelift_codegen::print_errors::{pretty_error, pretty_verifier_error};
|
use cranelift_codegen::print_errors::{pretty_error, pretty_verifier_error};
|
||||||
use cranelift_codegen::settings::FlagsOrIsa;
|
use cranelift_codegen::settings::FlagsOrIsa;
|
||||||
use cranelift_codegen::timing;
|
use cranelift_codegen::timing;
|
||||||
use cranelift_codegen::Context;
|
use cranelift_codegen::Context;
|
||||||
use cranelift_entity::EntityRef;
|
use cranelift_entity::EntityRef;
|
||||||
use cranelift_wasm::{
|
use cranelift_wasm::{translate_module, DummyEnvironment, FuncIndex, ReturnMode};
|
||||||
translate_module, DummyEnvironment, FuncIndex, ModuleEnvironment, ReturnMode,
|
|
||||||
};
|
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use term;
|
use term;
|
||||||
use crate::utils::{parse_sets_and_triple, read_to_end};
|
|
||||||
use wabt::wat2wasm;
|
use wabt::wat2wasm;
|
||||||
|
|
||||||
macro_rules! vprintln {
|
macro_rules! vprintln {
|
||||||
|
|||||||
@@ -138,6 +138,15 @@ impl DummyEnvironment {
|
|||||||
pub fn func_env(&self) -> DummyFuncEnvironment {
|
pub fn func_env(&self) -> DummyFuncEnvironment {
|
||||||
DummyFuncEnvironment::new(&self.info, self.return_mode)
|
DummyFuncEnvironment::new(&self.info, self.return_mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_func_type(&self, func_index: FuncIndex) -> SignatureIndex {
|
||||||
|
self.info.functions[func_index].entity
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return the number of imported functions within this `DummyEnvironment`.
|
||||||
|
pub fn get_num_func_imports(&self) -> usize {
|
||||||
|
self.info.imported_funcs.len()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The `FuncEnvironment` implementation for use by the `DummyEnvironment`.
|
/// The `FuncEnvironment` implementation for use by the `DummyEnvironment`.
|
||||||
@@ -345,10 +354,6 @@ impl<'data> ModuleEnvironment<'data> for DummyEnvironment {
|
|||||||
self.info.signatures.push(sig.clone());
|
self.info.signatures.push(sig.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_signature(&self, sig_index: SignatureIndex) -> &ir::Signature {
|
|
||||||
&self.info.signatures[sig_index]
|
|
||||||
}
|
|
||||||
|
|
||||||
fn declare_func_import(
|
fn declare_func_import(
|
||||||
&mut self,
|
&mut self,
|
||||||
sig_index: SignatureIndex,
|
sig_index: SignatureIndex,
|
||||||
@@ -366,18 +371,10 @@ impl<'data> ModuleEnvironment<'data> for DummyEnvironment {
|
|||||||
.push((String::from(module), String::from(field)));
|
.push((String::from(module), String::from(field)));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_num_func_imports(&self) -> usize {
|
|
||||||
self.info.imported_funcs.len()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn declare_func_type(&mut self, sig_index: SignatureIndex) {
|
fn declare_func_type(&mut self, sig_index: SignatureIndex) {
|
||||||
self.info.functions.push(Exportable::new(sig_index));
|
self.info.functions.push(Exportable::new(sig_index));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_func_type(&self, func_index: FuncIndex) -> SignatureIndex {
|
|
||||||
self.info.functions[func_index].entity
|
|
||||||
}
|
|
||||||
|
|
||||||
fn declare_global(&mut self, global: Global) {
|
fn declare_global(&mut self, global: Global) {
|
||||||
self.info.globals.push(Exportable::new(global));
|
self.info.globals.push(Exportable::new(global));
|
||||||
}
|
}
|
||||||
@@ -389,10 +386,6 @@ impl<'data> ModuleEnvironment<'data> for DummyEnvironment {
|
|||||||
.push((String::from(module), String::from(field)));
|
.push((String::from(module), String::from(field)));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_global(&self, global_index: GlobalIndex) -> &Global {
|
|
||||||
&self.info.globals[global_index].entity
|
|
||||||
}
|
|
||||||
|
|
||||||
fn declare_table(&mut self, table: Table) {
|
fn declare_table(&mut self, table: Table) {
|
||||||
self.info.tables.push(Exportable::new(table));
|
self.info.tables.push(Exportable::new(table));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -248,9 +248,6 @@ pub trait ModuleEnvironment<'data> {
|
|||||||
/// Declares a function signature to the environment.
|
/// Declares a function signature to the environment.
|
||||||
fn declare_signature(&mut self, sig: &ir::Signature);
|
fn declare_signature(&mut self, sig: &ir::Signature);
|
||||||
|
|
||||||
/// Return the signature with the given index.
|
|
||||||
fn get_signature(&self, sig_index: SignatureIndex) -> &ir::Signature;
|
|
||||||
|
|
||||||
/// Declares a function import to the environment.
|
/// Declares a function import to the environment.
|
||||||
fn declare_func_import(
|
fn declare_func_import(
|
||||||
&mut self,
|
&mut self,
|
||||||
@@ -259,24 +256,15 @@ pub trait ModuleEnvironment<'data> {
|
|||||||
field: &'data str,
|
field: &'data str,
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Return the number of imported funcs.
|
|
||||||
fn get_num_func_imports(&self) -> usize;
|
|
||||||
|
|
||||||
/// Declares the type (signature) of a local function in the module.
|
/// Declares the type (signature) of a local function in the module.
|
||||||
fn declare_func_type(&mut self, sig_index: SignatureIndex);
|
fn declare_func_type(&mut self, sig_index: SignatureIndex);
|
||||||
|
|
||||||
/// Return the signature index for the given function index.
|
|
||||||
fn get_func_type(&self, func_index: FuncIndex) -> SignatureIndex;
|
|
||||||
|
|
||||||
/// Declares a global to the environment.
|
/// Declares a global to the environment.
|
||||||
fn declare_global(&mut self, global: Global);
|
fn declare_global(&mut self, global: Global);
|
||||||
|
|
||||||
/// Declares a global import to the environment.
|
/// Declares a global import to the environment.
|
||||||
fn declare_global_import(&mut self, global: Global, module: &'data str, field: &'data str);
|
fn declare_global_import(&mut self, global: Global, module: &'data str, field: &'data str);
|
||||||
|
|
||||||
/// Return the global for the given global index.
|
|
||||||
fn get_global(&self, global_index: GlobalIndex) -> &Global;
|
|
||||||
|
|
||||||
/// Declares a table to the environment.
|
/// Declares a table to the environment.
|
||||||
fn declare_table(&mut self, table: Table);
|
fn declare_table(&mut self, table: Table);
|
||||||
|
|
||||||
@@ -291,6 +279,7 @@ pub trait ModuleEnvironment<'data> {
|
|||||||
offset: usize,
|
offset: usize,
|
||||||
elements: Vec<FuncIndex>,
|
elements: Vec<FuncIndex>,
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Declares a memory to the environment
|
/// Declares a memory to the environment
|
||||||
fn declare_memory(&mut self, memory: Memory);
|
fn declare_memory(&mut self, memory: Memory);
|
||||||
|
|
||||||
|
|||||||
@@ -244,14 +244,7 @@ pub fn parse_element_section<'data>(
|
|||||||
let mut init_expr_reader = init_expr.get_binary_reader();
|
let mut init_expr_reader = init_expr.get_binary_reader();
|
||||||
let (base, offset) = match init_expr_reader.read_operator()? {
|
let (base, offset) = match init_expr_reader.read_operator()? {
|
||||||
Operator::I32Const { value } => (None, value as u32 as usize),
|
Operator::I32Const { value } => (None, value as u32 as usize),
|
||||||
Operator::GetGlobal { global_index } => match environ
|
Operator::GetGlobal { global_index } => (Some(GlobalIndex::from_u32(global_index)), 0),
|
||||||
.get_global(GlobalIndex::from_u32(global_index))
|
|
||||||
.initializer
|
|
||||||
{
|
|
||||||
GlobalInit::I32Const(value) => (None, value as u32 as usize),
|
|
||||||
GlobalInit::Import => (Some(GlobalIndex::from_u32(global_index)), 0),
|
|
||||||
_ => panic!("should not happen"),
|
|
||||||
},
|
|
||||||
ref s => panic!("unsupported init expr in element section: {:?}", s),
|
ref s => panic!("unsupported init expr in element section: {:?}", s),
|
||||||
};
|
};
|
||||||
let items_reader = items.get_items_reader()?;
|
let items_reader = items.get_items_reader()?;
|
||||||
@@ -292,14 +285,7 @@ pub fn parse_data_section<'data>(
|
|||||||
let mut init_expr_reader = init_expr.get_binary_reader();
|
let mut init_expr_reader = init_expr.get_binary_reader();
|
||||||
let (base, offset) = match init_expr_reader.read_operator()? {
|
let (base, offset) = match init_expr_reader.read_operator()? {
|
||||||
Operator::I32Const { value } => (None, value as u32 as usize),
|
Operator::I32Const { value } => (None, value as u32 as usize),
|
||||||
Operator::GetGlobal { global_index } => match environ
|
Operator::GetGlobal { global_index } => (Some(GlobalIndex::from_u32(global_index)), 0),
|
||||||
.get_global(GlobalIndex::from_u32(global_index))
|
|
||||||
.initializer
|
|
||||||
{
|
|
||||||
GlobalInit::I32Const(value) => (None, value as u32 as usize),
|
|
||||||
GlobalInit::Import => (Some(GlobalIndex::from_u32(global_index)), 0),
|
|
||||||
_ => panic!("should not happen"),
|
|
||||||
},
|
|
||||||
ref s => panic!("unsupported init expr in data section: {:?}", s),
|
ref s => panic!("unsupported init expr in data section: {:?}", s),
|
||||||
};
|
};
|
||||||
environ.declare_data_initialization(
|
environ.declare_data_initialization(
|
||||||
|
|||||||
Reference in New Issue
Block a user