diff --git a/cranelift/wasm/src/code_translator.rs b/cranelift/wasm/src/code_translator.rs index 8b73f8dca6..26c7e5d8f8 100644 --- a/cranelift/wasm/src/code_translator.rs +++ b/cranelift/wasm/src/code_translator.rs @@ -533,7 +533,7 @@ pub fn translate_operator( // `index` is the index of the function's signature and `table_index` is the index of // the table to search the function in. let (sigref, num_args) = state.get_indirect_sig(builder.func, *index, environ)?; - let table = state.get_table(builder.func, *table_index, environ)?; + let table = state.get_or_create_table(builder.func, *table_index, environ)?; let callee = state.pop1(); // Bitcast any vector arguments to their default type, I8X16, before calling. @@ -1163,41 +1163,50 @@ pub fn translate_operator( environ.translate_data_drop(builder.cursor(), *segment)?; } Operator::TableSize { table: index } => { - let table = state.get_table(builder.func, *index, environ)?; + let table = state.get_or_create_table(builder.func, *index, environ)?; state.push1(environ.translate_table_size( builder.cursor(), TableIndex::from_u32(*index), table, )?); } - Operator::TableGrow { table } => { - let table_index = TableIndex::from_u32(*table); + Operator::TableGrow { table: index } => { + let table_index = TableIndex::from_u32(*index); + let table = state.get_or_create_table(builder.func, *index, environ)?; let delta = state.pop1(); let init_value = state.pop1(); state.push1(environ.translate_table_grow( builder.cursor(), table_index, + table, delta, init_value, )?); } - Operator::TableGet { table } => { - let table_index = TableIndex::from_u32(*table); + Operator::TableGet { table: index } => { + let table_index = TableIndex::from_u32(*index); + let table = state.get_or_create_table(builder.func, *index, environ)?; let index = state.pop1(); - state.push1(environ.translate_table_get(builder.cursor(), table_index, index)?); + state.push1(environ.translate_table_get( + builder.cursor(), + table_index, + table, + index, + )?); } - Operator::TableSet { table } => { - let table_index = TableIndex::from_u32(*table); + Operator::TableSet { table: index } => { + let table_index = TableIndex::from_u32(*index); + let table = state.get_or_create_table(builder.func, *index, environ)?; let value = state.pop1(); let index = state.pop1(); - environ.translate_table_set(builder.cursor(), table_index, value, index)?; + environ.translate_table_set(builder.cursor(), table_index, table, value, index)?; } Operator::TableCopy { dst_table: dst_table_index, src_table: src_table_index, } => { - let dst_table = state.get_table(builder.func, *dst_table_index, environ)?; - let src_table = state.get_table(builder.func, *src_table_index, environ)?; + let dst_table = state.get_or_create_table(builder.func, *dst_table_index, environ)?; + let src_table = state.get_or_create_table(builder.func, *src_table_index, environ)?; let len = state.pop1(); let src = state.pop1(); let dest = state.pop1(); @@ -1223,7 +1232,7 @@ pub fn translate_operator( segment, table: table_index, } => { - let table = state.get_table(builder.func, *table_index, environ)?; + let table = state.get_or_create_table(builder.func, *table_index, environ)?; let len = state.pop1(); let src = state.pop1(); let dest = state.pop1(); diff --git a/cranelift/wasm/src/environ/dummy.rs b/cranelift/wasm/src/environ/dummy.rs index 671414bcb6..2c4280e4a9 100644 --- a/cranelift/wasm/src/environ/dummy.rs +++ b/cranelift/wasm/src/environ/dummy.rs @@ -435,6 +435,7 @@ impl<'dummy_environment> FuncEnvironment for DummyFuncEnvironment<'dummy_environ &mut self, mut pos: FuncCursor, _table_index: TableIndex, + _table: ir::Table, _delta: ir::Value, _init_value: ir::Value, ) -> WasmResult { @@ -445,6 +446,7 @@ impl<'dummy_environment> FuncEnvironment for DummyFuncEnvironment<'dummy_environ &mut self, mut pos: FuncCursor, _table_index: TableIndex, + _table: ir::Table, _index: ir::Value, ) -> WasmResult { Ok(pos.ins().null(self.reference_type())) @@ -454,6 +456,7 @@ impl<'dummy_environment> FuncEnvironment for DummyFuncEnvironment<'dummy_environ &mut self, _pos: FuncCursor, _table_index: TableIndex, + _table: ir::Table, _value: ir::Value, _index: ir::Value, ) -> WasmResult<()> { diff --git a/cranelift/wasm/src/environ/spec.rs b/cranelift/wasm/src/environ/spec.rs index 0473ad3c5a..98ca1c7095 100644 --- a/cranelift/wasm/src/environ/spec.rs +++ b/cranelift/wasm/src/environ/spec.rs @@ -355,6 +355,7 @@ pub trait FuncEnvironment: TargetEnvironment { &mut self, pos: FuncCursor, table_index: TableIndex, + table: ir::Table, delta: ir::Value, init_value: ir::Value, ) -> WasmResult; @@ -364,6 +365,7 @@ pub trait FuncEnvironment: TargetEnvironment { &mut self, pos: FuncCursor, table_index: TableIndex, + table: ir::Table, index: ir::Value, ) -> WasmResult; @@ -372,6 +374,7 @@ pub trait FuncEnvironment: TargetEnvironment { &mut self, pos: FuncCursor, table_index: TableIndex, + table: ir::Table, value: ir::Value, index: ir::Value, ) -> WasmResult<()>; diff --git a/cranelift/wasm/src/state/func_state.rs b/cranelift/wasm/src/state/func_state.rs index 81a0d35e97..24ef5ff0cb 100644 --- a/cranelift/wasm/src/state/func_state.rs +++ b/cranelift/wasm/src/state/func_state.rs @@ -202,7 +202,7 @@ pub struct FuncTranslationState { heaps: HashMap, // Map of tables that have been created by `FuncEnvironment::make_table`. - tables: HashMap, + pub(crate) tables: HashMap, // Map of indirect call signatures that have been created by // `FuncEnvironment::make_indirect_sig()`. @@ -446,7 +446,7 @@ impl FuncTranslationState { /// Get the `Table` reference that should be used to access table `index`. /// Create the reference if necessary. - pub(crate) fn get_table( + pub(crate) fn get_or_create_table( &mut self, func: &mut ir::Function, index: u32, diff --git a/crates/environ/src/func_environ.rs b/crates/environ/src/func_environ.rs index 384ffe63a5..3a51e838b2 100644 --- a/crates/environ/src/func_environ.rs +++ b/crates/environ/src/func_environ.rs @@ -622,6 +622,7 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m &mut self, mut pos: cranelift_codegen::cursor::FuncCursor<'_>, table_index: TableIndex, + _table: ir::Table, delta: ir::Value, init_value: ir::Value, ) -> WasmResult { @@ -649,6 +650,7 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m &mut self, _: cranelift_codegen::cursor::FuncCursor<'_>, _: TableIndex, + _: ir::Table, _: ir::Value, ) -> WasmResult { Err(WasmError::Unsupported( @@ -660,6 +662,7 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m &mut self, _: cranelift_codegen::cursor::FuncCursor<'_>, _: TableIndex, + _: ir::Table, _: ir::Value, _: ir::Value, ) -> WasmResult<()> {