diff --git a/Cargo.lock b/Cargo.lock index 9078cb2..fcc9079 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -227,12 +227,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - [[package]] name = "fastrand" version = "2.3.0" @@ -371,9 +365,7 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" dependencies = [ - "fallible-iterator", "indexmap", - "stable_deref_trait", ] [[package]] @@ -642,20 +634,6 @@ version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cde51589ab56b20a6f686b2c68f7a0bd6add753d697abf720d63f8db3ab7b1ad" -[[package]] -name = "orca-wasm" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ce9b3c6e21f067e2c1c85a4478ec26dda0a51fec5bc932dfa77f016a880861" -dependencies = [ - "gimli", - "log", - "serde_json", - "tempfile", - "wasm-encoder 0.227.1", - "wasmparser 0.227.1", -] - [[package]] name = "percent-encoding" version = "2.3.1" @@ -824,10 +802,11 @@ dependencies = [ "clap", "heck", "js-component-bindgen", - "orca-wasm", "rand", + "serde_json", "wasm-encoder 0.227.1", - "wasmparser 0.227.1", + "wasmparser 0.239.0", + "wirm", "wit-bindgen", "wit-bindgen-core", "wit-component", @@ -996,6 +975,16 @@ dependencies = [ "wasmparser 0.227.1", ] +[[package]] +name = "wasm-encoder" +version = "0.239.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be00faa2b4950c76fe618c409d2c3ea5a3c9422013e079482d78544bb2d184c" +dependencies = [ + "leb128fmt", + "wasmparser 0.239.0", +] + [[package]] name = "wasm-metadata" version = "0.227.1" @@ -1033,6 +1022,18 @@ name = "wasmparser" version = "0.227.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f51cad774fb3c9461ab9bccc9c62dfb7388397b5deda31bf40e8108ccd678b2" +dependencies = [ + "bitflags", + "hashbrown", + "indexmap", + "semver", +] + +[[package]] +name = "wasmparser" +version = "0.239.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9d90bb93e764f6beabf1d02028c70a2156a6583e63ac4218dd07ef733368b0" dependencies = [ "bitflags", "hashbrown", @@ -1187,6 +1188,19 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "wirm" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14732cb9a0eaf9ec52ecd36b9394ade5c16eea5405d160d8829f0199d97d507d" +dependencies = [ + "log", + "serde_json", + "tempfile", + "wasm-encoder 0.239.0", + "wasmparser 0.239.0", +] + [[package]] name = "wit-bindgen" version = "0.41.0" diff --git a/Cargo.toml b/Cargo.toml index 39e8d17..3767688 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,10 +14,11 @@ too_many_arguments = 'allow' anyhow = { version = "1.0.95", default-features = false } heck = { version = "0.5", default-features = false } js-component-bindgen = { version = "1.11.0" } -orca-wasm = { version = "0.9.2", default-features = false } +wirm = { version = "2.1.0", default-features = false } rand = { version = "0.8", default-features = false } +serde_json = { version = "1.0", default-features = false, features = ["alloc"] } wasm-encoder = { version = "0.227.1", features = [ "component-model", "std" ] } -wasmparser = { version = "0.227.1", features = ["features", +wasmparser = { version = "0.239.0", features = ["features", "component-model", "hash-collections", "serde", diff --git a/crates/spidermonkey-embedding-splicer/Cargo.toml b/crates/spidermonkey-embedding-splicer/Cargo.toml index be8d7e6..438408d 100644 --- a/crates/spidermonkey-embedding-splicer/Cargo.toml +++ b/crates/spidermonkey-embedding-splicer/Cargo.toml @@ -16,8 +16,9 @@ anyhow = { workspace = true } clap = { version = "4.5.31", features = ["suggestions", "color", "derive"] } heck = { workspace = true } js-component-bindgen = { workspace = true, features = [ "transpile-bindgen" ] } -orca-wasm = { workspace = true } +wirm = { workspace = true } rand = { workspace = true } +serde_json = { workspace = true } wasm-encoder = { workspace = true } wasmparser = { workspace = true } wit-bindgen = { workspace = true } diff --git a/crates/spidermonkey-embedding-splicer/src/splice.rs b/crates/spidermonkey-embedding-splicer/src/splice.rs index 38606a0..a1a137f 100644 --- a/crates/spidermonkey-embedding-splicer/src/splice.rs +++ b/crates/spidermonkey-embedding-splicer/src/splice.rs @@ -1,17 +1,17 @@ use std::path::PathBuf; use anyhow::Result; -use orca_wasm::ir::function::{FunctionBuilder, FunctionModifier}; -use orca_wasm::ir::id::{ExportsID, FunctionID, LocalID}; -use orca_wasm::ir::module::Module; -use orca_wasm::ir::types::{BlockType, ElementItems, InstrumentationMode}; -use orca_wasm::module_builder::AddLocal; -use orca_wasm::opcode::{Inject, InjectAt}; -use orca_wasm::{DataType, Opcode}; use wasm_encoder::{Encode, Section}; use wasmparser::ExternalKind; use wasmparser::MemArg; use wasmparser::Operator; +use wirm::ir::function::{FunctionBuilder, FunctionModifier}; +use wirm::ir::id::{ExportsID, FunctionID, LocalID}; +use wirm::ir::module::Module; +use wirm::ir::types::{BlockType, ElementItems, InstrumentationMode}; +use wirm::module_builder::AddLocal; +use wirm::opcode::{Inject, InjectAt}; +use wirm::{DataType, Opcode}; use wit_component::metadata::{decode, Bindgen}; use wit_component::StringEncoding; use wit_parser::Resolve; @@ -725,7 +725,7 @@ fn synthesize_import_functions( // create imported function table let els = module.elements.iter_mut().next().unwrap(); - if let ElementItems::Functions(ref mut funcs) = &mut els.1 { + if let ElementItems::Functions(ref mut funcs) = &mut els.items { for fid in import_fnids { funcs.push(fid); } @@ -757,20 +757,25 @@ fn synthesize_import_functions( .get_fn_modifier(coreabi_get_import_fid) .unwrap(); - // walk until we get to the const representing the table index - let mut table_instr_idx = 0; - for (idx, instr) in builder.body.instructions.iter_mut().enumerate() { - if let Operator::I32Const { value: ref mut v } = instr.op { - // we specifically need the const "around" 3393 - // which is the coreabi_sample_i32 table offset - if *v < 1000 || *v > 5000 { - continue; + // Find the I32Const base index and compute the delta to new base + let mut table_instr_idx = 0usize; + let mut delta: i32 = 0; + { + let ops_ro = builder.body.instructions.get_ops(); + for (idx, op) in ops_ro.iter().enumerate() { + if let Operator::I32Const { value } = op { + // we specifically need the const "around" 3393 + // which is the coreabi_sample_i32 table offset + if *value < 1000 || *value > 5000 { + continue; + } + delta = import_fn_table_start_idx - *value; + table_instr_idx = idx; + break; } - *v = import_fn_table_start_idx; - table_instr_idx = idx; - break; } } + builder.inject_at( table_instr_idx, InstrumentationMode::Before, @@ -783,6 +788,17 @@ fn synthesize_import_functions( InstrumentationMode::Before, Operator::I32Add, ); + + if delta != 0 { + builder + .body + .instructions + .add_instr(table_instr_idx, Operator::I32Const { value: delta }); + builder + .body + .instructions + .add_instr(table_instr_idx, Operator::I32Add); + } } // remove unnecessary exports diff --git a/crates/spidermonkey-embedding-splicer/src/stub_wasi.rs b/crates/spidermonkey-embedding-splicer/src/stub_wasi.rs index 9fe125b..7484d40 100644 --- a/crates/spidermonkey-embedding-splicer/src/stub_wasi.rs +++ b/crates/spidermonkey-embedding-splicer/src/stub_wasi.rs @@ -3,13 +3,13 @@ use std::path::PathBuf; use std::time::{SystemTime, UNIX_EPOCH}; use anyhow::{bail, Result}; -use orca_wasm::ir::function::FunctionBuilder; -use orca_wasm::ir::id::{FunctionID, LocalID}; -use orca_wasm::ir::module::module_functions::FuncKind; -use orca_wasm::ir::types::{BlockType, InitExpr, Value}; -use orca_wasm::module_builder::AddLocal; -use orca_wasm::{DataType, Instructions, Module, Opcode}; use wasmparser::{MemArg, TypeRef}; +use wirm::ir::function::FunctionBuilder; +use wirm::ir::id::{FunctionID, LocalID}; +use wirm::ir::module::module_functions::FuncKind; +use wirm::ir::types::{BlockType, InitExpr, Value}; +use wirm::module_builder::AddLocal; +use wirm::{DataType, InitInstr, Module, Opcode}; use wit_parser::Resolve; use crate::parse_wit; @@ -44,14 +44,14 @@ where }; let ty = module.types.get(ty_id).unwrap(); - let (params, results) = (ty.params().to_vec(), ty.results().to_vec()); - let mut builder = FunctionBuilder::new(params.as_slice(), results.as_slice()); + let mut builder = FunctionBuilder::new(ty.params().as_slice(), ty.results().as_slice()); let _args = stub(&mut builder)?; builder.replace_import_in_module(module, iid); return Ok(Some(fid)); } + Ok(None) } @@ -206,7 +206,7 @@ fn stub_random(module: &mut Module) -> Result<()> { // create a mutable random seed global let seed_val: i64 = 0; let seed_global = module.add_global( - InitExpr::new(vec![Instructions::Value(Value::I64(seed_val))]), + InitExpr::new(vec![InitInstr::Value(Value::I64(seed_val))]), DataType::I64, true, false,