This commit is contained in:
Graham Kelly 2024-06-19 22:01:39 -04:00
parent 3f9e7a560f
commit 332a4216e6
10 changed files with 1502 additions and 23 deletions

View file

@ -25,10 +25,11 @@ libfuzzer-sys = { version = "0.4", optional = true }
indexmap = "2.2.2"
stacker = "0.1.15"
wasm-smith = { version = "0.202", optional = true }
paste = "1.0.15"
[features]
default = []
fuzzing = ["libfuzzer-sys", "wasm-smith"]
[lib]
name = "waffle"
name = "waffle"

View file

@ -980,6 +980,122 @@ impl<'a> WasmFuncBackend<'a> {
let h: wasm_encoder::RefType = ty.clone().into();
Some(wasm_encoder::Instruction::RefNull(h.heap_type))
}
Operator::MemoryAtomicNotify { memarg } => Some(wasm_encoder::Instruction::MemoryAtomicNotify(memarg.clone().into())),
Operator::MemoryAtomicWait32 { memarg } => Some(wasm_encoder::Instruction::MemoryAtomicWait32(memarg.clone().into())),
Operator::MemoryAtomicWait64 { memarg } => Some(wasm_encoder::Instruction::MemoryAtomicWait64(memarg.clone().into())),
Operator::AtomicFence => Some(wasm_encoder::Instruction::AtomicFence),
Operator::I32AtomicLoad { memarg } => Some(wasm_encoder::Instruction::I32AtomicLoad(memarg.clone().into())),
Operator::I64AtomicLoad { memarg } => Some(wasm_encoder::Instruction::I64AtomicLoad(memarg.clone().into())),
Operator::I32AtomicLoad8U { memarg } => Some(wasm_encoder::Instruction::I32AtomicLoad8U(memarg.clone().into())),
Operator::I32AtomicLoad16U { memarg } => Some(wasm_encoder::Instruction::I32AtomicLoad16U(memarg.clone().into())),
Operator::I64AtomicLoad8U { memarg } => Some(wasm_encoder::Instruction::I64AtomicLoad8U(memarg.clone().into())),
Operator::I64AtomicLoad16U { memarg } => Some(wasm_encoder::Instruction::I64AtomicLoad16U(memarg.clone().into())),
Operator::I64AtomicLoad32U { memarg } => Some(wasm_encoder::Instruction::I64AtomicLoad32U(memarg.clone().into())),
// Operator::I32AtomicStore { memarg } => todo!(),
// Operator::I64AtomicStore { memarg } => todo!(),
// Operator::I32AtomicStore8 { memarg } => todo!(),
// Operator::I32AtomicStore16 { memarg } => todo!(),
// Operator::I64AtomicStore8 { memarg } => todo!(),
// Operator::I64AtomicStore16 { memarg } => todo!(),
// Operator::I64AtomicStore32 { memarg } => todo!(),
Operator::I32AtomicStore { memarg } => Some(wasm_encoder::Instruction::I32AtomicStore(memarg.clone().into())),
Operator::I64AtomicStore { memarg } => Some(wasm_encoder::Instruction::I64AtomicStore(memarg.clone().into())),
Operator::I32AtomicStore8 { memarg } => Some(wasm_encoder::Instruction::I32AtomicStore8(memarg.clone().into())),
Operator::I32AtomicStore16 { memarg } => Some(wasm_encoder::Instruction::I32AtomicStore16(memarg.clone().into())),
Operator::I64AtomicStore8 { memarg } => Some(wasm_encoder::Instruction::I64AtomicStore8(memarg.clone().into())),
Operator::I64AtomicStore16 { memarg } => Some(wasm_encoder::Instruction::I64AtomicStore16(memarg.clone().into())),
Operator::I64AtomicStore32 { memarg } => Some(wasm_encoder::Instruction::I64AtomicStore32(memarg.clone().into())),
Operator::I32AtomicRmwAdd { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmwAdd(memarg.clone().into())),
Operator::I64AtomicRmwAdd { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmwAdd(memarg.clone().into())),
Operator::I32AtomicRmw8AddU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw8AddU(memarg.clone().into())),
Operator::I32AtomicRmw16AddU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw16AddU(memarg.clone().into())),
Operator::I64AtomicRmw8AddU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw8AddU(memarg.clone().into())),
Operator::I64AtomicRmw16AddU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw16AddU(memarg.clone().into())),
Operator::I64AtomicRmw32AddU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw32AddU(memarg.clone().into())),
// Operator::I32AtomicRmwSub { memarg } => todo!(),
// Operator::I64AtomicRmwSub { memarg } => todo!(),
// Operator::I32AtomicRmw8SubU { memarg } => todo!(),
// Operator::I32AtomicRmw16SubU { memarg } => todo!(),
// Operator::I64AtomicRmw8SubU { memarg } => todo!(),
// Operator::I64AtomicRmw16SubU { memarg } => todo!(),
// Operator::I64AtomicRmw32SubU { memarg } => todo!(),
Operator::I32AtomicRmwSub { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmwSub(memarg.clone().into())),
Operator::I64AtomicRmwSub { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmwSub(memarg.clone().into())),
Operator::I32AtomicRmw8SubU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw8SubU(memarg.clone().into())),
Operator::I32AtomicRmw16SubU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw16SubU(memarg.clone().into())),
Operator::I64AtomicRmw8SubU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw8SubU(memarg.clone().into())),
Operator::I64AtomicRmw16SubU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw16SubU(memarg.clone().into())),
Operator::I64AtomicRmw32SubU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw32SubU(memarg.clone().into())),
// Operator::I32AtomicRmwAnd { memarg } => todo!(),
// Operator::I64AtomicRmwAnd { memarg } => todo!(),
// Operator::I32AtomicRmw8AndU { memarg } => todo!(),
// Operator::I32AtomicRmw16AndU { memarg } => todo!(),
// Operator::I64AtomicRmw8AndU { memarg } => todo!(),
// Operator::I64AtomicRmw16AndU { memarg } => todo!(),
// Operator::I64AtomicRmw32AndU { memarg } => todo!(),
Operator::I32AtomicRmwAnd { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmwAnd(memarg.clone().into())),
Operator::I64AtomicRmwAnd { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmwAnd(memarg.clone().into())),
Operator::I32AtomicRmw8AndU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw8AndU(memarg.clone().into())),
Operator::I32AtomicRmw16AndU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw16AndU(memarg.clone().into())),
Operator::I64AtomicRmw8AndU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw8AndU(memarg.clone().into())),
Operator::I64AtomicRmw16AndU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw16AndU(memarg.clone().into())),
Operator::I64AtomicRmw32AndU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw32AndU(memarg.clone().into())),
// Operator::I32AtomicRmwOr { memarg } => todo!(),
// Operator::I64AtomicRmwOr { memarg } => todo!(),
// Operator::I32AtomicRmw8OrU { memarg } => todo!(),
// Operator::I32AtomicRmw16OrU { memarg } => todo!(),
// Operator::I64AtomicRmw8OrU { memarg } => todo!(),
// Operator::I64AtomicRmw16OrU { memarg } => todo!(),
// Operator::I64AtomicRmw32OrU { memarg } => todo!(),
Operator::I32AtomicRmwOr { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmwOr(memarg.clone().into())),
Operator::I64AtomicRmwOr { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmwOr(memarg.clone().into())),
Operator::I32AtomicRmw8OrU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw8OrU(memarg.clone().into())),
Operator::I32AtomicRmw16OrU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw16OrU(memarg.clone().into())),
Operator::I64AtomicRmw8OrU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw8OrU(memarg.clone().into())),
Operator::I64AtomicRmw16OrU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw16OrU(memarg.clone().into())),
Operator::I64AtomicRmw32OrU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw32OrU(memarg.clone().into())),
// Operator::I32AtomicRmwXor { memarg } => todo!(),
// Operator::I64AtomicRmwXor { memarg } => todo!(),
// Operator::I32AtomicRmw8XorU { memarg } => todo!(),
// Operator::I32AtomicRmw16XorU { memarg } => todo!(),
// Operator::I64AtomicRmw8XorU { memarg } => todo!(),
// Operator::I64AtomicRmw16XorU { memarg } => todo!(),
// Operator::I64AtomicRmw32XorU { memarg } => todo!(),
Operator::I32AtomicRmwXor { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmwXor(memarg.clone().into())),
Operator::I64AtomicRmwXor { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmwXor(memarg.clone().into())),
Operator::I32AtomicRmw8XorU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw8XorU(memarg.clone().into())),
Operator::I32AtomicRmw16XorU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw16XorU(memarg.clone().into())),
Operator::I64AtomicRmw8XorU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw8XorU(memarg.clone().into())),
Operator::I64AtomicRmw16XorU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw16XorU(memarg.clone().into())),
Operator::I64AtomicRmw32XorU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw32XorU(memarg.clone().into())),
// Operator::I32AtomicRmwXchg { memarg } => todo!(),
// Operator::I64AtomicRmwXchg { memarg } => todo!(),
// Operator::I32AtomicRmw8XchgU { memarg } => todo!(),
// Operator::I32AtomicRmw16XchgU { memarg } => todo!(),
// Operator::I64AtomicRmw8XchgU { memarg } => todo!(),
// Operator::I64AtomicRmw16XchgU { memarg } => todo!(),
// Operator::I64AtomicRmw32XchgU { memarg } => todo!(),
Operator::I32AtomicRmwXchg { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmwXchg(memarg.clone().into())),
Operator::I64AtomicRmwXchg { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmwXchg(memarg.clone().into())),
Operator::I32AtomicRmw8XchgU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw8XchgU(memarg.clone().into())),
Operator::I32AtomicRmw16XchgU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw16XchgU(memarg.clone().into())),
Operator::I64AtomicRmw8XchgU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw8XchgU(memarg.clone().into())),
Operator::I64AtomicRmw16XchgU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw16XchgU(memarg.clone().into())),
Operator::I64AtomicRmw32XchgU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw32XchgU(memarg.clone().into())),
// Operator::I32AtomicRmwCmpxchg { memarg } => todo!(),
// Operator::I64AtomicRmwCmpxchg { memarg } => todo!(),
// Operator::I32AtomicRmw8CmpxchgU { memarg } => todo!(),
// Operator::I32AtomicRmw16CmpxchgU { memarg } => todo!(),
// Operator::I64AtomicRmw8CmpxchgU { memarg } => todo!(),
// Operator::I64AtomicRmw16CmpxchgU { memarg } => todo!(),
// Operator::I64AtomicRmw32CmpxchgU { memarg } => todo!(),
Operator::I32AtomicRmwCmpxchg { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmwCmpxchg(memarg.clone().into())),
Operator::I64AtomicRmwCmpxchg { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmwCmpxchg(memarg.clone().into())),
Operator::I32AtomicRmw8CmpxchgU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw8CmpxchgU(memarg.clone().into())),
Operator::I32AtomicRmw16CmpxchgU { memarg } => Some(wasm_encoder::Instruction::I32AtomicRmw16CmpxchgU(memarg.clone().into())),
Operator::I64AtomicRmw8CmpxchgU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw8CmpxchgU(memarg.clone().into())),
Operator::I64AtomicRmw16CmpxchgU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw16CmpxchgU(memarg.clone().into())),
Operator::I64AtomicRmw32CmpxchgU { memarg } => Some(wasm_encoder::Instruction::I64AtomicRmw32CmpxchgU(memarg.clone().into())),
};
if let Some(inst) = inst {
@ -1042,8 +1158,8 @@ pub fn compile(module: &Module<'_>) -> anyhow::Result<wasm_encoder::Module> {
num_mem_imports += 1;
let mem = &module.memories[mem];
wasm_encoder::EntityType::Memory(wasm_encoder::MemoryType {
memory64: false,
shared: false,
memory64: mem.memory64,
shared: mem.shared,
minimum: mem.initial_pages as u64,
maximum: mem.maximum_pages.map(|val| val as u64),
})
@ -1088,7 +1204,7 @@ pub fn compile(module: &Module<'_>) -> anyhow::Result<wasm_encoder::Module> {
minimum: mem_data.initial_pages as u64,
maximum: mem_data.maximum_pages.map(|val| val as u64),
memory64: mem_data.memory64,
shared: false,
shared: mem_data.shared,
});
}
into_mod.section(&memories);

1
src/copying.rs Normal file
View file

@ -0,0 +1 @@
pub mod module;

358
src/copying/module.rs Normal file
View file

@ -0,0 +1,358 @@
use crate::util::{add_start, new_sig};
use crate::op_traits::rewrite_mem;
use paste::paste;
use std::{
backtrace,
borrow::Cow,
collections::{BTreeMap, BTreeSet, HashMap},
hash::Hash,
iter::empty,
ops::{Deref, DerefMut},
};
use crate::{
entity::EntityRef, ExportKind, Func, FuncDecl, FunctionBody, Global, ImportKind, Memory, Module, Operator, Signature, SignatureData, Table, TableData, Type, ValueDef
};
#[derive(Eq, PartialEq, Clone)]
pub struct IKW(pub ImportKind);
impl Hash for IKW {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
match &self.0 {
ImportKind::Table(a) => {
state.write_usize(0);
a.hash(state);
}
ImportKind::Func(a) => {
state.write_usize(1);
a.hash(state);
}
ImportKind::Global(a) => {
state.write_usize(2);
a.hash(state);
}
ImportKind::Memory(a) => {
state.write_usize(3);
a.hash(state);
}
}
}
}
pub struct State<I> {
cache: HashMap<IKW, ImportKind>,
fun_cache: BTreeMap<Func, Func>,
table_cache: BTreeMap<Table, Table>,
pub importmap: I,
pub tables: BTreeSet<Table>,
}
impl<I> State<I> {
pub fn new(importmap: I, tables: BTreeSet<Table>) -> Self {
return Self {
importmap,
cache: Default::default(),
fun_cache: Default::default(),
table_cache: Default::default(),
tables,
};
}
}
pub struct Copier<A, B, S> {
pub src: A,
pub dest: B,
pub state: S,
}
macro_rules! translator {
($a:tt) => {
paste! {
pub fn [<translate_ $a>](&mut self, m: $a) -> anyhow::Result<$a>{
let ImportKind::$a(n) = self.translate_import(ImportKind::$a(m))? else{
anyhow::bail!("not the right item")
};
return Ok(n);
}
}
};
}
pub trait Imports {
fn get_import(
&mut self,
a: &mut Module<'_>,
m: String,
n: String,
) -> anyhow::Result<Option<ImportBehavior>>;
}
#[repr(transparent)]
#[derive(Clone, Debug, Copy)]
pub struct ImportFn<F>(pub F);
impl<F: FnMut(&mut Module<'_>, String, String) -> anyhow::Result<Option<ImportBehavior>>> Imports
for ImportFn<F>
{
fn get_import(
&mut self,
a: &mut Module<'_>,
m: String,
n: String,
) -> anyhow::Result<Option<ImportBehavior>> {
return (self.0)(a, m, n);
}
}
pub enum ImportBehavior {
Bind(ImportKind),
Passthrough(String, String),
}
impl<
'a: 'b,
'b,
A: Deref<Target = crate::Module<'a>>,
B: Deref<Target = crate::Module<'b>> + DerefMut,
S: Deref<Target = State<I>> + DerefMut,
I: Deref<Target = J> + DerefMut,
J: Imports + ?Sized,
> Copier<A, B, S>
{
// pub fn collect(&mut self) -> anyhow::Result<BTreeMap<String, ExportKind>> {
// let e = get_exports(&self.src);
// // let mut m = HashMap::new();
// let mut m = BTreeMap::new();
// for (s, e) in e {
// let e = x2i(e);
// let r = self.translate_import(e.clone())?;
// m.insert(s, i2x(r));
// }
// return Ok(m);
// }
pub fn new(
src: A,
dest: B,
// importmap: BTreeMap<(String, String), ImportKind>,
cache: S,
) -> Self {
return Self {
src,
dest,
// importmap,
state: cache,
};
}
pub fn resolve_import(&mut self, a: &ImportKind) -> anyhow::Result<Option<ImportBehavior>> {
for i in self.src.imports.iter() {
if i.kind == *a {
return self.state.importmap.get_import(
&mut self.dest,
i.module.clone(),
i.name.clone(),
);
}
}
return Ok(None);
}
pub fn internal_translate_mem(&mut self, a: crate::Memory) -> anyhow::Result<crate::Memory> {
let d = self.src.memories[a].clone();
return Ok(self.dest.memories.push(d));
}
pub fn internal_translate_global(
&mut self,
a: crate::Global,
) -> anyhow::Result<crate::Global> {
let d = self.src.globals[a].clone();
return Ok(self.dest.globals.push(d));
}
pub fn translate_import(&mut self, a: ImportKind) -> anyhow::Result<ImportKind> {
let i = match self.resolve_import(&a)? {
None => None,
Some(ImportBehavior::Bind(b)) => return Ok(b),
Some(ImportBehavior::Passthrough(a, b)) => Some((a, b)),
};
if let Some(j) = i.clone() {
for m in self.dest.imports.iter() {
if m.module == j.0 && m.name == j.1 {
return Ok(m.kind.clone());
}
}
}
if let Some(b) = self.state.cache.get(&IKW(a.clone())) {
return Ok(b.clone());
}
let c = match a {
ImportKind::Table(t) => ImportKind::Table(self.internal_translate_table(t)?),
ImportKind::Func(f) => ImportKind::Func(self.internal_translate_func(f)?),
ImportKind::Global(g) => ImportKind::Global(self.internal_translate_global(g)?),
ImportKind::Memory(m) => ImportKind::Memory(self.internal_translate_mem(m)?),
};
self.state.cache.insert(IKW(a.clone()), c.clone());
if let Some(j) = i {
self.dest.imports.push(crate::Import {
module: j.0,
name: j.1,
kind: c.clone(),
})
}
return Ok(c);
}
pub fn internal_translate_table(&mut self, tk: Table) -> anyhow::Result<Table> {
// if let Some(c) = self.state.table_cache.get(&tk) {
// return Ok(*c);
// }
let mut t = self.src.tables[tk].clone();
if let Type::TypedFuncRef{sig_index,..} = &mut t.ty{
*sig_index = self.translate_sig(*sig_index)?;
}
// let nt = self.dest.tables.push(t.clone());
// self.state.table_cache.insert(tk, nt);
if let Some(u) = t.func_elements.as_mut() {
for w in u.iter_mut() {
*w = self.translate_Func(*w)?;
}
}
// self.dest.tables[nt] = t;
return Ok(self.dest.tables.push(t));
}
pub fn translate_sig(&mut self, s: Signature) -> anyhow::Result<Signature> {
let mut d = self.src.signatures[s].clone();
for x in d.params.iter_mut().chain(d.returns.iter_mut()){
if let Type::TypedFuncRef{sig_index,..} = x{
*sig_index = self.translate_sig(*sig_index)?;
}
}
return Ok(new_sig(&mut *self.dest, d));
}
pub fn internal_translate_func(&mut self, f: Func) -> anyhow::Result<Func> {
if f == Func::invalid() {
return Ok(f);
}
if let Some(x) = self.state.fun_cache.get(&f) {
return Ok(*x);
}
let a = self.dest.funcs.push(crate::FuncDecl::None);
self.state.fun_cache.insert(f, a);
for t in &self.state.tables {
self.dest.tables[*t]
.func_elements
.get_or_insert(vec![])
.push(a);
}
if Some(f) == self.src.start_func {
add_start(&mut self.dest, a);
}
let mut f = self.src.funcs[f].clone();
if let Some(b) = f.body_mut() {
for v in b.values.iter() {
let mut k = b.values[v].clone();
if let ValueDef::BlockParam(_, _, x) = &mut k{
if let Type::TypedFuncRef{sig_index,..} = x{
*sig_index = self.translate_sig(*sig_index)?;
}
}
if let ValueDef::PickOutput(_,_ , x) = &mut k{
if let Type::TypedFuncRef{sig_index,..} = x{
*sig_index = self.translate_sig(*sig_index)?;
}
}
if let ValueDef::Operator(a, vs, c) = &mut k {
let mut w = b.arg_pool[*vs].to_vec();
let mut e = None;
rewrite_mem(a, &mut w, |m, _| {
*m = self.translate_Memory(*m)?;
Ok::<_,anyhow::Error>(())
})?;
if let Some(e) = e {
return Err(e);
}
match a {
crate::Operator::Call { function_index } => {
*function_index = self.translate_Func(*function_index)?;
}
crate::Operator::RefFunc { func_index } => {
*func_index = self.translate_Func(*func_index)?;
}
crate::Operator::RefNull { ty } => {
if let Type::TypedFuncRef{sig_index,..} = ty{
*sig_index = self.translate_sig(*sig_index)?;
}
}
crate::Operator::TypedSelect { ty } => {
if let Type::TypedFuncRef{sig_index,..} = ty{
*sig_index = self.translate_sig(*sig_index)?;
}
}
Operator::CallRef { sig_index } => {
*sig_index = self.translate_sig(*sig_index)?;
}
crate::Operator::CallIndirect {
sig_index,
table_index,
} => {
*sig_index = self.translate_sig(*sig_index)?;
*table_index = self.translate_Table(*table_index)?;
}
crate::Operator::GlobalGet { global_index } => {
*global_index = self.translate_Global(*global_index)?;
}
crate::Operator::GlobalSet { global_index } => {
*global_index = self.translate_Global(*global_index)?;
}
crate::Operator::TableGet { table_index } => {
*table_index = self.translate_Table(*table_index)?;
}
crate::Operator::TableSet { table_index } => {
*table_index = self.translate_Table(*table_index)?;
}
crate::Operator::TableGrow { table_index } => {
*table_index = self.translate_Table(*table_index)?;
}
crate::Operator::TableSize { table_index } => {
*table_index = self.translate_Table(*table_index)?;
}
_ => {}
}
*vs = b.arg_pool.from_iter(w.into_iter());
}
b.values[v] = k;
}
for k in b.blocks.iter() {
let mut kv = b.blocks[k].clone();
match &mut kv.terminator {
crate::Terminator::ReturnCall { func, args } => {
*func = self.translate_Func(*func)?;
}
crate::Terminator::ReturnCallIndirect { sig, table, args } => {
*sig = self.translate_sig(*sig)?;
*table = self.translate_Table(*table)?;
}
_ => {}
}
b.blocks[k] = kv;
}
for x in b.type_pool.storage.iter_mut(){
if let Type::TypedFuncRef{sig_index,..} = x{
*sig_index = self.translate_sig(*sig_index)?;
}
}
// (self.state.instrument)(&mut self.dest,b)?;
}
match &mut f {
crate::FuncDecl::Import(a, _) => {
*a = self.translate_sig(*a)?;
}
crate::FuncDecl::Lazy(_, _, _) => todo!(),
crate::FuncDecl::Body(a, _, _) => {
*a = self.translate_sig(*a)?;
}
crate::FuncDecl::Compiled(_, _, _) => todo!(),
crate::FuncDecl::None => {}
}
self.dest.funcs[a] = f;
return Ok(a);
}
translator!(Memory);
translator!(Table);
translator!(Global);
translator!(Func);
}
#[cfg(test)]
mod tests {
use super::*;
}

View file

@ -145,7 +145,8 @@ fn handle_payload<'a>(
initial_pages: mem.initial as usize,
maximum_pages: mem.maximum.map(|max| max as usize),
segments: vec![],
memory64: mem.memory64
memory64: mem.memory64,
shared: mem.shared
});
ImportKind::Memory(mem)
}
@ -230,7 +231,8 @@ fn handle_payload<'a>(
initial_pages: memory.initial as usize,
maximum_pages: memory.maximum.map(|max| max as usize),
segments: vec![],
memory64: memory.memory64
memory64: memory.memory64,
shared: memory.shared
});
}
}

View file

@ -35,6 +35,7 @@ pub struct MemoryData {
pub maximum_pages: Option<usize>,
pub segments: Vec<MemorySegment>,
pub memory64: bool,
pub shared: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]

View file

@ -29,3 +29,5 @@ pub use passes::basic_opt::OptOptions;
#[cfg(feature = "fuzzing")]
pub mod fuzzing;
pub mod copying;

View file

@ -266,9 +266,9 @@ pub fn op_inputs(
}
Operator::TableSize { .. } => Ok(Cow::Borrowed(&[])),
Operator::MemorySize { .. } => Ok(Cow::Borrowed(&[])),
Operator::MemoryGrow { mem } => Ok(if module.memories[*mem].memory64{
Operator::MemoryGrow { mem } => Ok(if module.memories[*mem].memory64 {
Cow::Borrowed(&[Type::I64])
}else{
} else {
Cow::Borrowed(&[Type::I32])
}),
@ -661,7 +661,10 @@ pub fn op_inputs(
Operator::CallRef { sig_index } => {
let mut params = module.signatures[*sig_index].params.to_vec();
params.push(Type::TypedFuncRef{nullable: true, sig_index: *sig_index});
params.push(Type::TypedFuncRef {
nullable: true,
sig_index: *sig_index,
});
Ok(params.into())
}
Operator::RefIsNull => {
@ -685,6 +688,399 @@ pub fn op_inputs(
Ok(Cow::Borrowed(&[Type::I32, Type::I32, Type::I32]))
}
}
Operator::MemoryAtomicNotify { memarg } => {
if module.memories[memarg.memory].memory64 {
Ok(Cow::Borrowed(&[Type::I64, Type::I32]))
} else {
Ok(Cow::Borrowed(&[Type::I32, Type::I32]))
}
} //=> visit_memory_atomic_notify
Operator::MemoryAtomicWait32 { memarg } => {
if module.memories[memarg.memory].memory64 {
Ok(Cow::Borrowed(&[Type::I64, Type::I32, Type::I32]))
} else {
Ok(Cow::Borrowed(&[Type::I32, Type::I32, Type::I32]))
}
} //=> visit_memory_atomic_wait32
Operator::MemoryAtomicWait64 { memarg } => {
if module.memories[memarg.memory].memory64 {
Ok(Cow::Borrowed(&[Type::I64, Type::I64, Type::I32]))
} else {
Ok(Cow::Borrowed(&[Type::I32, Type::I64, Type::I32]))
}
} //=> visit_memory_atomic_wait64
Operator::AtomicFence => Ok(Cow::Borrowed(&[])), // => visit_atomic_fence
Operator::I32AtomicLoad { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64])
} else {
Cow::Borrowed(&[Type::I32])
}), //=> visit_i32_atomic_load
Operator::I64AtomicLoad { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64])
} else {
Cow::Borrowed(&[Type::I32])
}), //=> visit_i64_atomic_load
Operator::I32AtomicLoad8U { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64])
} else {
Cow::Borrowed(&[Type::I32])
}), //=> visit_i32_atomic_load8_u
Operator::I32AtomicLoad16U { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64])
} else {
Cow::Borrowed(&[Type::I32])
}), //=> visit_i32_atomic_load16_u
Operator::I64AtomicLoad8U { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64])
} else {
Cow::Borrowed(&[Type::I32])
}), //=> visit_i64_atomic_load8_u
Operator::I64AtomicLoad16U { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64])
} else {
Cow::Borrowed(&[Type::I32])
}), //=> visit_i64_atomic_load16_u
Operator::I64AtomicLoad32U { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64])
} else {
Cow::Borrowed(&[Type::I32])
}), //=> visit_i64_atomic_load32_u
Operator::I32AtomicStore { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_store
Operator::I64AtomicStore { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_store
Operator::I32AtomicStore8 { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_store8
Operator::I32AtomicStore16 { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_store16
Operator::I64AtomicStore8 { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_store8
Operator::I64AtomicStore16 { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_store16
Operator::I64AtomicStore32 { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_store32
Operator::I32AtomicRmwAdd { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw_add
Operator::I64AtomicRmwAdd { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw_add
Operator::I32AtomicRmw8AddU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw8_add_u
Operator::I32AtomicRmw16AddU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw16_add_u
Operator::I64AtomicRmw8AddU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw8_add_u
Operator::I64AtomicRmw16AddU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw16_add_u
Operator::I64AtomicRmw32AddU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw32_add_u
// Operator::I32AtomicRmwSub { memarg } => Some(memarg), //=> visit_i32_atomic_rmw_sub
// Operator::I64AtomicRmwSub { memarg } => Some(memarg), //=> visit_i64_atomic_rmw_sub
// Operator::I32AtomicRmw8SubU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw8_sub_u
// Operator::I32AtomicRmw16SubU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw16_sub_u
// Operator::I64AtomicRmw8SubU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw8_sub_u
// Operator::I64AtomicRmw16SubU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw16_sub_u
// Operator::I64AtomicRmw32SubU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw32_sub_u
Operator::I32AtomicRmwSub { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw_add
Operator::I64AtomicRmwSub { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw_Sub
Operator::I32AtomicRmw8SubU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw8_Sub_u
Operator::I32AtomicRmw16SubU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw16_Sub_u
Operator::I64AtomicRmw8SubU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw8_Sub_u
Operator::I64AtomicRmw16SubU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw16_Sub_u
Operator::I64AtomicRmw32SubU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw32_Sub_u
// Operator::I32AtomicRmwAnd { memarg } => Some(memarg), //=> visit_i32_atomic_rmw_and
// Operator::I64AtomicRmwAnd { memarg } => Some(memarg), //=> visit_i64_atomic_rmw_and
// Operator::I32AtomicRmw8AndU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw8_and_u
// Operator::I32AtomicRmw16AndU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw16_and_u
// Operator::I64AtomicRmw8AndU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw8_and_u
// Operator::I64AtomicRmw16AndU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw16_and_u
// Operator::I64AtomicRmw32AndU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw32_and_u
Operator::I32AtomicRmwAnd { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw_And
Operator::I64AtomicRmwAnd { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw_And
Operator::I32AtomicRmw8AndU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw8_And_u
Operator::I32AtomicRmw16AndU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw16_And_u
Operator::I64AtomicRmw8AndU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw8_And_u
Operator::I64AtomicRmw16AndU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw16_And_u
Operator::I64AtomicRmw32AndU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw32_And_u
// Operator::I32AtomicRmwOr { memarg }, // => visit_i32_atomic_rmw_or
// Operator::I64AtomicRmwOr { memarg } => Some(memarg),//=> visit_i64_atomic_rmw_or
// Operator::I32AtomicRmw8OrU { memarg } => Some(memarg),//=> visit_i32_atomic_rmw8_or_u
// Operator::I32AtomicRmw16OrU { memarg } => Some(memarg),//=> visit_i32_atomic_rmw16_or_u
// Operator::I64AtomicRmw8OrU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw8_or_u
// Operator::I64AtomicRmw16OrU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw16_or_u
// Operator::I64AtomicRmw32OrU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw32_or_u
Operator::I32AtomicRmwOr { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw_Or
Operator::I64AtomicRmwOr { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw_Or
Operator::I32AtomicRmw8OrU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw8_Or_u
Operator::I32AtomicRmw16OrU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw16_Or_u
Operator::I64AtomicRmw8OrU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw8_Or_u
Operator::I64AtomicRmw16OrU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw16_Or_u
Operator::I64AtomicRmw32OrU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw32_Or_u
// Operator::I32AtomicRmwXor { memarg } => Some(memarg),//=> visit_i32_atomic_rmw_xor
// Operator::I64AtomicRmwXor { memarg } => Some(memarg),//=> visit_i64_atomic_rmw_xor
// Operator::I32AtomicRmw8XorU { memarg } => Some(memarg),//=> visit_i32_atomic_rmw8_xor_u
// Operator::I32AtomicRmw16XorU { memarg } => Some(memarg),//=> visit_i32_atomic_rmw16_xor_u
// Operator::I64AtomicRmw8XorU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw8_xor_u
// Operator::I64AtomicRmw16XorU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw16_xor_u
// Operator::I64AtomicRmw32XorU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw32_xor_u
Operator::I32AtomicRmwXor { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw_Xor
Operator::I64AtomicRmwXor { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw_Xor
Operator::I32AtomicRmw8XorU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw8_Xor_u
Operator::I32AtomicRmw16XorU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw16_Xor_u
Operator::I64AtomicRmw8XorU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw8_Xor_u
Operator::I64AtomicRmw16XorU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw16_Xor_u
Operator::I64AtomicRmw32XorU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw32_Xor_u
// Operator::I32AtomicRmwXchg { memarg } => Some(memarg),//=> visit_i32_atomic_rmw_xchg
// Operator::I64AtomicRmwXchg { memarg } => Some(memarg),//=> visit_i64_atomic_rmw_xchg
// Operator::I32AtomicRmw8XchgU { memarg },// => visit_i32_atomic_rmw8_xchg_u
// Operator::I32AtomicRmw16XchgU { memarg },// => visit_i32_atomic_rmw16_xchg_u
// Operator::I64AtomicRmw8XchgU { memarg },// => visit_i64_atomic_rmw8_xchg_u
// Operator::I64AtomicRmw16XchgU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw16_xchg_u
// Operator::I64AtomicRmw32XchgU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw32_xchg_u
Operator::I32AtomicRmwXchg { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw_Xchg
Operator::I64AtomicRmwXchg { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw_Xchg
Operator::I32AtomicRmw8XchgU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
}), //=> visit_i32_atomic_rmw8_Xchg_u
Operator::I32AtomicRmw16XchgU { memarg } => {
Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32])
})
} //=> visit_i32_atomic_rmw16_Xchg_u
Operator::I64AtomicRmw8XchgU { memarg } => Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
}), //=> visit_i64_atomic_rmw8_Xchg_u
Operator::I64AtomicRmw16XchgU { memarg } => {
Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
})
} //=> visit_i64_atomic_rmw16_Xchg_u
Operator::I64AtomicRmw32XchgU { memarg } => {
Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64])
})
} //=> visit_i64_atomic_rmw32_Xchg_u
Operator::I32AtomicRmwCmpxchg { memarg } => {
Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32, Type::I32])
})
} //=> visit_i32_atomic_rmw_cmpxchg
Operator::I64AtomicRmwCmpxchg { memarg } => {
Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64, Type::I64])
})
} //=> visit_i64_atomic_rmw_cmpxchg
Operator::I32AtomicRmw8CmpxchgU { memarg } => {
Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32, Type::I32])
})
} // => visit_i32_atomic_rmw8_cmpxchg_u
Operator::I32AtomicRmw16CmpxchgU { memarg } => {
Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I32, Type::I32])
} else {
Cow::Borrowed(&[Type::I32, Type::I32, Type::I32])
})
} // => visit_i32_atomic_rmw16_cmpxchg_u
Operator::I64AtomicRmw8CmpxchgU { memarg } => {
Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64, Type::I64])
})
} // => visit_i64_atomic_rmw8_cmpxchg_u
Operator::I64AtomicRmw16CmpxchgU { memarg } => {
Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64, Type::I64])
})
} // => visit_i64_atomic_rmw16_cmpxchg_u
Operator::I64AtomicRmw32CmpxchgU { memarg } => {
Ok(if module.memories[memarg.memory].memory64 {
Cow::Borrowed(&[Type::I64, Type::I64, Type::I64])
} else {
Cow::Borrowed(&[Type::I32, Type::I64, Type::I64])
})
} //=> visit_i64_atomic_rmw32_c
}
}
@ -727,6 +1123,15 @@ pub fn op_outputs(
| Operator::I64Load16U { .. }
| Operator::I64Load32S { .. }
| Operator::I64Load32U { .. } => Ok(Cow::Borrowed(&[Type::I64])),
Operator::I32AtomicLoad { .. }
| Operator::I32AtomicLoad8U { .. }
| Operator::I32AtomicLoad16U { .. } => Ok(Cow::Borrowed(&[Type::I32])),
Operator::I64AtomicLoad { .. }
| Operator::I64AtomicLoad8U { .. }
| Operator::I64AtomicLoad16U { .. }
| Operator::I64AtomicLoad32U { .. } => Ok(Cow::Borrowed(&[Type::I64])),
Operator::F32Load { .. } => Ok(Cow::Borrowed(&[Type::F32])),
Operator::F64Load { .. } => Ok(Cow::Borrowed(&[Type::F64])),
@ -740,6 +1145,14 @@ pub fn op_outputs(
Operator::I64Store16 { .. } => Ok(Cow::Borrowed(&[])),
Operator::I64Store32 { .. } => Ok(Cow::Borrowed(&[])),
Operator::I32AtomicStore { .. } => Ok(Cow::Borrowed(&[])),
Operator::I64AtomicStore { .. } => Ok(Cow::Borrowed(&[])),
Operator::I32AtomicStore8 { .. } => Ok(Cow::Borrowed(&[])),
Operator::I32AtomicStore16 { .. } => Ok(Cow::Borrowed(&[])),
Operator::I64AtomicStore8 { .. } => Ok(Cow::Borrowed(&[])),
Operator::I64AtomicStore16 { .. } => Ok(Cow::Borrowed(&[])),
Operator::I64AtomicStore32 { .. } => Ok(Cow::Borrowed(&[])),
Operator::I32Const { .. } => Ok(Cow::Borrowed(&[Type::I32])),
Operator::I64Const { .. } => Ok(Cow::Borrowed(&[Type::I64])),
Operator::F32Const { .. } => Ok(Cow::Borrowed(&[Type::F32])),
@ -890,14 +1303,14 @@ pub fn op_outputs(
Operator::TableSet { .. } => Ok(Cow::Borrowed(&[])),
Operator::TableGrow { .. } => Ok(Cow::Borrowed(&[])),
Operator::TableSize { .. } => Ok(Cow::Borrowed(&[Type::I32])),
Operator::MemorySize { mem } => Ok(if module.memories[*mem].memory64{
Operator::MemorySize { mem } => Ok(if module.memories[*mem].memory64 {
Cow::Borrowed(&[Type::I64])
}else{
} else {
Cow::Borrowed(&[Type::I32])
}),
Operator::MemoryGrow { mem } => Ok(if module.memories[*mem].memory64{
Operator::MemoryGrow { mem } => Ok(if module.memories[*mem].memory64 {
Cow::Borrowed(&[Type::I64])
}else{
} else {
Cow::Borrowed(&[Type::I32])
}),
Operator::MemoryCopy { .. } => Ok(Cow::Borrowed(&[])),
@ -1163,9 +1576,67 @@ pub fn op_outputs(
Operator::RefIsNull => Ok(Cow::Borrowed(&[Type::I32])),
Operator::RefFunc { func_index } => {
let ty = module.funcs[*func_index].sig();
Ok(vec![Type::TypedFuncRef{nullable:true, sig_index:ty}].into())
Ok(vec![Type::TypedFuncRef {
nullable: true,
sig_index: ty,
}]
.into())
}
Operator::RefNull { ty } => Ok(vec![ty.clone()].into()),
Operator::MemoryAtomicNotify { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_memory_atomic_notify
Operator::MemoryAtomicWait32 { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_memory_atomic_wait32
Operator::MemoryAtomicWait64 { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_memory_atomic_wait64
Operator::AtomicFence => Ok(Cow::Borrowed(&[])), // => visit_atomic_fence
Operator::I32AtomicRmwAdd { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw_add
Operator::I64AtomicRmwAdd { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw_add
Operator::I32AtomicRmw8AddU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw8_add_u
Operator::I32AtomicRmw16AddU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw16_add_u
Operator::I64AtomicRmw8AddU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw8_add_u
Operator::I64AtomicRmw16AddU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw16_add_u
Operator::I64AtomicRmw32AddU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw32_add_u
Operator::I32AtomicRmwSub { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw_sub
Operator::I64AtomicRmwSub { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw_sub
Operator::I32AtomicRmw8SubU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw8_sub_u
Operator::I32AtomicRmw16SubU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw16_sub_u
Operator::I64AtomicRmw8SubU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw8_sub_u
Operator::I64AtomicRmw16SubU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw16_sub_u
Operator::I64AtomicRmw32SubU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw32_sub_u
Operator::I32AtomicRmwAnd { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw_and
Operator::I64AtomicRmwAnd { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw_and
Operator::I32AtomicRmw8AndU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw8_and_u
Operator::I32AtomicRmw16AndU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw16_and_u
Operator::I64AtomicRmw8AndU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw8_and_u
Operator::I64AtomicRmw16AndU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw16_and_u
Operator::I64AtomicRmw32AndU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw32_and_u
Operator::I32AtomicRmwOr { memarg } => Ok(Cow::Borrowed(&[Type::I32])), // => visit_i32_atomic_rmw_or
Operator::I64AtomicRmwOr { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw_or
Operator::I32AtomicRmw8OrU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw8_or_u
Operator::I32AtomicRmw16OrU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw16_or_u
Operator::I64AtomicRmw8OrU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw8_or_u
Operator::I64AtomicRmw16OrU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw16_or_u
Operator::I64AtomicRmw32OrU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw32_or_u
Operator::I32AtomicRmwXor { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw_xor
Operator::I64AtomicRmwXor { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw_xor
Operator::I32AtomicRmw8XorU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw8_xor_u
Operator::I32AtomicRmw16XorU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw16_xor_u
Operator::I64AtomicRmw8XorU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw8_xor_u
Operator::I64AtomicRmw16XorU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw16_xor_u
Operator::I64AtomicRmw32XorU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw32_xor_u
Operator::I32AtomicRmwXchg { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw_xchg
Operator::I64AtomicRmwXchg { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw_xchg
Operator::I32AtomicRmw8XchgU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), // => visit_i32_atomic_rmw8_xchg_u
Operator::I32AtomicRmw16XchgU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), // => visit_i32_atomic_rmw16_xchg_u
Operator::I64AtomicRmw8XchgU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), // => visit_i64_atomic_rmw8_xchg_u
Operator::I64AtomicRmw16XchgU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw16_xchg_u
Operator::I64AtomicRmw32XchgU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw32_xchg_u
Operator::I32AtomicRmwCmpxchg { memarg } => Ok(Cow::Borrowed(&[Type::I32])), //=> visit_i32_atomic_rmw_cmpxchg
Operator::I64AtomicRmwCmpxchg { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw_cmpxchg
Operator::I32AtomicRmw8CmpxchgU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), // => visit_i32_atomic_rmw8_cmpxchg_u
Operator::I32AtomicRmw16CmpxchgU { memarg } => Ok(Cow::Borrowed(&[Type::I32])), // => visit_i32_atomic_rmw16_cmpxchg_u
Operator::I64AtomicRmw8CmpxchgU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), // => visit_i64_atomic_rmw8_cmpxchg_u
Operator::I64AtomicRmw16CmpxchgU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), // => visit_i64_atomic_rmw16_cmpxchg_u
Operator::I64AtomicRmw32CmpxchgU { memarg } => Ok(Cow::Borrowed(&[Type::I64])), //=> visit_i64_atomic_rmw32_c
}
}
@ -1181,6 +1652,7 @@ pub enum SideEffect {
ReadLocal,
WriteLocal,
All,
AtomicStuff,
}
impl Operator {
@ -1637,6 +2109,74 @@ impl Operator {
Operator::RefIsNull => &[],
Operator::RefFunc { .. } => &[],
Operator::RefNull { ty } => &[],
Operator::MemoryAtomicNotify { memarg } => &[AtomicStuff], //=> visit_memory_atomic_notify
Operator::MemoryAtomicWait32 { memarg } => &[AtomicStuff], //=> visit_memory_atomic_wait32
Operator::MemoryAtomicWait64 { memarg } => &[AtomicStuff], //=> visit_memory_atomic_wait64
Operator::AtomicFence => &[AtomicStuff], // => visit_atomic_fence
Operator::I32AtomicLoad { memarg } => &[AtomicStuff, ReadMem], //=> visit_i32_atomic_load
Operator::I64AtomicLoad { memarg } => &[AtomicStuff, ReadMem], //=> visit_i64_atomic_load
Operator::I32AtomicLoad8U { memarg } => &[AtomicStuff, ReadMem], //=> visit_i32_atomic_load8_u
Operator::I32AtomicLoad16U { memarg } => &[AtomicStuff, ReadMem], //=> visit_i32_atomic_load16_u
Operator::I64AtomicLoad8U { memarg } => &[AtomicStuff, ReadMem], //=> visit_i64_atomic_load8_u
Operator::I64AtomicLoad16U { memarg } => &[AtomicStuff, ReadMem], //=> visit_i64_atomic_load16_u
Operator::I64AtomicLoad32U { memarg } => &[AtomicStuff, ReadMem], //=> visit_i64_atomic_load32_u
Operator::I32AtomicStore { memarg } => &[AtomicStuff, WriteMem], //=> visit_i32_atomic_store
Operator::I64AtomicStore { memarg } => &[AtomicStuff, WriteMem], //=> visit_i64_atomic_store
Operator::I32AtomicStore8 { memarg } => &[AtomicStuff, WriteMem], //=> visit_i32_atomic_store8
Operator::I32AtomicStore16 { memarg } => &[AtomicStuff, WriteMem], //=> visit_i32_atomic_store16
Operator::I64AtomicStore8 { memarg } => &[AtomicStuff, WriteMem], //=> visit_i64_atomic_store8
Operator::I64AtomicStore16 { memarg } => &[AtomicStuff, WriteMem], //=> visit_i64_atomic_store16
Operator::I64AtomicStore32 { memarg } => &[AtomicStuff, WriteMem], //=> visit_i64_atomic_store32
Operator::I32AtomicRmwAdd { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw_add
Operator::I64AtomicRmwAdd { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw_add
Operator::I32AtomicRmw8AddU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw8_add_u
Operator::I32AtomicRmw16AddU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw16_add_u
Operator::I64AtomicRmw8AddU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw8_add_u
Operator::I64AtomicRmw16AddU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw16_add_u
Operator::I64AtomicRmw32AddU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw32_add_u
Operator::I32AtomicRmwSub { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw_sub
Operator::I64AtomicRmwSub { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw_sub
Operator::I32AtomicRmw8SubU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw8_sub_u
Operator::I32AtomicRmw16SubU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw16_sub_u
Operator::I64AtomicRmw8SubU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw8_sub_u
Operator::I64AtomicRmw16SubU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw16_sub_u
Operator::I64AtomicRmw32SubU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw32_sub_u
Operator::I32AtomicRmwAnd { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw_and
Operator::I64AtomicRmwAnd { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw_and
Operator::I32AtomicRmw8AndU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw8_and_u
Operator::I32AtomicRmw16AndU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw16_and_u
Operator::I64AtomicRmw8AndU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw8_and_u
Operator::I64AtomicRmw16AndU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw16_and_u
Operator::I64AtomicRmw32AndU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw32_and_u
Operator::I32AtomicRmwOr { memarg } => &[AtomicStuff, WriteMem, ReadMem], // => visit_i32_atomic_rmw_or
Operator::I64AtomicRmwOr { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw_or
Operator::I32AtomicRmw8OrU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw8_or_u
Operator::I32AtomicRmw16OrU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw16_or_u
Operator::I64AtomicRmw8OrU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw8_or_u
Operator::I64AtomicRmw16OrU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw16_or_u
Operator::I64AtomicRmw32OrU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw32_or_u
Operator::I32AtomicRmwXor { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw_xor
Operator::I64AtomicRmwXor { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw_xor
Operator::I32AtomicRmw8XorU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw8_xor_u
Operator::I32AtomicRmw16XorU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw16_xor_u
Operator::I64AtomicRmw8XorU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw8_xor_u
Operator::I64AtomicRmw16XorU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw16_xor_u
Operator::I64AtomicRmw32XorU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw32_xor_u
Operator::I32AtomicRmwXchg { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw_xchg
Operator::I64AtomicRmwXchg { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw_xchg
Operator::I32AtomicRmw8XchgU { memarg } => &[AtomicStuff, WriteMem, ReadMem], // => visit_i32_atomic_rmw8_xchg_u
Operator::I32AtomicRmw16XchgU { memarg } => &[AtomicStuff, WriteMem, ReadMem], // => visit_i32_atomic_rmw16_xchg_u
Operator::I64AtomicRmw8XchgU { memarg } => &[AtomicStuff, WriteMem, ReadMem], // => visit_i64_atomic_rmw8_xchg_u
Operator::I64AtomicRmw16XchgU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw16_xchg_u
Operator::I64AtomicRmw32XchgU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw32_xchg_u
Operator::I32AtomicRmwCmpxchg { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i32_atomic_rmw_cmpxchg
Operator::I64AtomicRmwCmpxchg { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw_cmpxchg
Operator::I32AtomicRmw8CmpxchgU { memarg } => &[AtomicStuff, WriteMem, ReadMem], // => visit_i32_atomic_rmw8_cmpxchg_u
Operator::I32AtomicRmw16CmpxchgU { memarg } => &[AtomicStuff, WriteMem, ReadMem], // => visit_i32_atomic_rmw16_cmpxchg_u
Operator::I64AtomicRmw8CmpxchgU { memarg } => &[AtomicStuff, WriteMem, ReadMem], // => visit_i64_atomic_rmw8_cmpxchg_u
Operator::I64AtomicRmw16CmpxchgU { memarg } => &[AtomicStuff, WriteMem, ReadMem], // => visit_i64_atomic_rmw16_cmpxchg_u
Operator::I64AtomicRmw32CmpxchgU { memarg } => &[AtomicStuff, WriteMem, ReadMem], //=> visit_i64_atomic_rmw32_c
}
}
@ -2136,6 +2676,136 @@ impl std::fmt::Display for Operator {
Operator::RefIsNull => write!(f, "ref_is_null")?,
Operator::RefFunc { func_index } => write!(f, "ref_func<{}>", func_index)?,
Operator::RefNull { ty } => write!(f, "ref_null<{}>", ty)?,
Operator::MemoryAtomicNotify { memarg } => write!(f, "memory_atomic_notify<{memarg}>")?, //=> visit_memory_atomic_notify
Operator::MemoryAtomicWait32 { memarg } => write!(f, "memory_atomic_wait32<{memarg}>")?, //=> visit_memory_atomic_wait32
Operator::MemoryAtomicWait64 { memarg } => write!(f, "memory_atomic_wait64<{memarg}>")?, //=> visit_memory_atomic_wait64
Operator::AtomicFence => write!(f, "atomic_fence")?, // => visit_atomic_fence
Operator::I32AtomicLoad { memarg } => write!(f, "i32atomic_load<{memarg}>")?, //=> visit_i32_atomic_load
Operator::I64AtomicLoad { memarg } => write!(f, "i64atomic_load<{memarg}>")?, //=> visit_i64_atomic_load
Operator::I32AtomicLoad8U { memarg } => write!(f, "i32atomic_load8u<{memarg}>")?, //=> visit_i32_atomic_load8_u
Operator::I32AtomicLoad16U { memarg } => write!(f, "i32atomic_load16u<{memarg}>")?, //=> visit_i32_atomic_load16_u
Operator::I64AtomicLoad8U { memarg } => write!(f, "i64atomic_load8u<{memarg}>")?, //=> visit_i64_atomic_load8_u
Operator::I64AtomicLoad16U { memarg } => write!(f, "i64atomic_load16u<{memarg}>")?, //=> visit_i64_atomic_load16_u
Operator::I64AtomicLoad32U { memarg } => write!(f, "i64atomic_load32u<{memarg}>")?, //=> visit_i64_atomic_load32_u
Operator::I32AtomicStore { memarg } => write!(f, "i32atomic_store<{memarg}>")?, //=> visit_i32_atomic_store
Operator::I64AtomicStore { memarg } => write!(f, "i64atomic_store<{memarg}>")?, //=> visit_i64_atomic_store
Operator::I32AtomicStore8 { memarg } => write!(f, "i32atomic_store8<{memarg}>")?, //=> visit_i32_atomic_store8
Operator::I32AtomicStore16 { memarg } => write!(f, "i32atomic_store16<{memarg}>")?, //=> visit_i32_atomic_store16
Operator::I64AtomicStore8 { memarg } => write!(f, "i64atomic_store8<{memarg}>")?, //=> visit_i64_atomic_store8
Operator::I64AtomicStore16 { memarg } => write!(f, "i64atomic_store16<{memarg}>")?, //=> visit_i64_atomic_store16
Operator::I64AtomicStore32 { memarg } => write!(f, "i64atomic_store32<{memarg}>")?, //=> visit_i64_atomic_store32
Operator::I32AtomicRmwAdd { memarg } => write!(f, "i32atomic_rmwAdd<{memarg}>")?, //=> visit_i32_atomic_rmw_add
Operator::I64AtomicRmwAdd { memarg } => write!(f, "i64atomic_rmwAdd<{memarg}>")?, //=> visit_i64_atomic_rmw_add
Operator::I32AtomicRmw8AddU { memarg } => write!(f, "i32atomic_rmw8Addu<{memarg}>")?, //=> visit_i32_atomic_rmw8_add_u
Operator::I32AtomicRmw16AddU { memarg } => write!(f, "i32atomic_rmw16Addu<{memarg}>")?, //=> visit_i32_atomic_rmw16_add_u
Operator::I64AtomicRmw8AddU { memarg } => write!(f, "i64atomic_rmw8Addu<{memarg}>")?, //=> visit_i64_atomic_rmw8_add_u
Operator::I64AtomicRmw16AddU { memarg } => write!(f, "i32atomic_rmw16Addu<{memarg}>")?, //=> visit_i64_atomic_rmw16_add_u
Operator::I64AtomicRmw32AddU { memarg } => write!(f, "i32atomic_rmw32Addu<{memarg}>")?, //=> visit_i64_atomic_rmw32_add_u
// Operator::I32AtomicRmwSub { memarg } => Some(memarg), //=> visit_i32_atomic_rmw_sub
// Operator::I64AtomicRmwSub { memarg } => Some(memarg), //=> visit_i64_atomic_rmw_sub
// Operator::I32AtomicRmw8SubU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw8_sub_u
// Operator::I32AtomicRmw16SubU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw16_sub_u
// Operator::I64AtomicRmw8SubU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw8_sub_u
// Operator::I64AtomicRmw16SubU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw16_sub_u
// Operator::I64AtomicRmw32SubU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw32_sub_u
Operator::I32AtomicRmwSub { memarg } => write!(f, "i32atomic_rmwSub<{memarg}>")?, //=> visit_i32_atomic_rmw_Sub
Operator::I64AtomicRmwSub { memarg } => write!(f, "i64atomic_rmwSub<{memarg}>")?, //=> visit_i64_atomic_rmw_Sub
Operator::I32AtomicRmw8SubU { memarg } => write!(f, "i32atomic_rmw8Subu<{memarg}>")?, //=> visit_i32_atomic_rmw8_Sub_u
Operator::I32AtomicRmw16SubU { memarg } => write!(f, "i32atomic_rmw16Subu<{memarg}>")?, //=> visit_i32_atomic_rmw16_Sub_u
Operator::I64AtomicRmw8SubU { memarg } => write!(f, "i64atomic_rmw8Subu<{memarg}>")?, //=> visit_i64_atomic_rmw8_Sub_u
Operator::I64AtomicRmw16SubU { memarg } => write!(f, "i32atomic_rmw16Subu<{memarg}>")?, //=> visit_i64_atomic_rmw16_Sub_u
Operator::I64AtomicRmw32SubU { memarg } => write!(f, "i32atomic_rmw32Subu<{memarg}>")?, //=> visit_i64_atomic_rmw32_Sub_u
// Operator::I32AtomicRmwAnd { memarg } => Some(memarg), //=> visit_i32_atomic_rmw_and
// Operator::I64AtomicRmwAnd { memarg } => Some(memarg), //=> visit_i64_atomic_rmw_and
// Operator::I32AtomicRmw8AndU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw8_and_u
// Operator::I32AtomicRmw16AndU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw16_and_u
// Operator::I64AtomicRmw8AndU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw8_and_u
// Operator::I64AtomicRmw16AndU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw16_and_u
// Operator::I64AtomicRmw32AndU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw32_and_u
Operator::I32AtomicRmwAnd { memarg } => write!(f, "i32atomic_rmwAnd<{memarg}>")?, //=> visit_i32_atomic_rmw_And
Operator::I64AtomicRmwAnd { memarg } => write!(f, "i64atomic_rmwAnd<{memarg}>")?, //=> visit_i64_atomic_rmw_And
Operator::I32AtomicRmw8AndU { memarg } => write!(f, "i32atomic_rmw8Andu<{memarg}>")?, //=> visit_i32_atomic_rmw8_And_u
Operator::I32AtomicRmw16AndU { memarg } => write!(f, "i32atomic_rmw16Andu<{memarg}>")?, //=> visit_i32_atomic_rmw16_And_u
Operator::I64AtomicRmw8AndU { memarg } => write!(f, "i64atomic_rmw8Andu<{memarg}>")?, //=> visit_i64_atomic_rmw8_And_u
Operator::I64AtomicRmw16AndU { memarg } => write!(f, "i32atomic_rmw16Andu<{memarg}>")?, //=> visit_i64_atomic_rmw16_And_u
Operator::I64AtomicRmw32AndU { memarg } => write!(f, "i32atomic_rmw32Andu<{memarg}>")?, //=> visit_i64_atomic_rmw32_And_u
// Operator::I32AtomicRmwOr { memarg }, // => visit_i32_atomic_rmw_or
// Operator::I64AtomicRmwOr { memarg } => Some(memarg),//=> visit_i64_atomic_rmw_or
// Operator::I32AtomicRmw8OrU { memarg } => Some(memarg),//=> visit_i32_atomic_rmw8_or_u
// Operator::I32AtomicRmw16OrU { memarg } => Some(memarg),//=> visit_i32_atomic_rmw16_or_u
// Operator::I64AtomicRmw8OrU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw8_or_u
// Operator::I64AtomicRmw16OrU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw16_or_u
// Operator::I64AtomicRmw32OrU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw32_or_u
Operator::I32AtomicRmwOr { memarg } => write!(f, "i32atomic_rmwOr<{memarg}>")?, //=> visit_i32_atomic_rmw_Or
Operator::I64AtomicRmwOr { memarg } => write!(f, "i64atomic_rmwOr<{memarg}>")?, //=> visit_i64_atomic_rmw_Or
Operator::I32AtomicRmw8OrU { memarg } => write!(f, "i32atomic_rmw8Oru<{memarg}>")?, //=> visit_i32_atomic_rmw8_Or_u
Operator::I32AtomicRmw16OrU { memarg } => write!(f, "i32atomic_rmw16Oru<{memarg}>")?, //=> visit_i32_atomic_rmw16_Or_u
Operator::I64AtomicRmw8OrU { memarg } => write!(f, "i64atomic_rmw8Oru<{memarg}>")?, //=> visit_i64_atomic_rmw8_Or_u
Operator::I64AtomicRmw16OrU { memarg } => write!(f, "i32atomic_rmw16Oru<{memarg}>")?, //=> visit_i64_atomic_rmw16_Or_u
Operator::I64AtomicRmw32OrU { memarg } => write!(f, "i32atomic_rmw32Oru<{memarg}>")?, //=> visit_i64_atomic_rmw32_Or_u
// Operator::I32AtomicRmwXor { memarg } => Some(memarg),//=> visit_i32_atomic_rmw_xor
// Operator::I64AtomicRmwXor { memarg } => Some(memarg),//=> visit_i64_atomic_rmw_xor
// Operator::I32AtomicRmw8XorU { memarg } => Some(memarg),//=> visit_i32_atomic_rmw8_xor_u
// Operator::I32AtomicRmw16XorU { memarg } => Some(memarg),//=> visit_i32_atomic_rmw16_xor_u
// Operator::I64AtomicRmw8XorU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw8_xor_u
// Operator::I64AtomicRmw16XorU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw16_xor_u
// Operator::I64AtomicRmw32XorU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw32_xor_u
Operator::I32AtomicRmwXor { memarg } => write!(f, "i32atomic_rmwXor<{memarg}>")?, //=> visit_i32_atomic_rmw_Xor
Operator::I64AtomicRmwXor { memarg } => write!(f, "i64atomic_rmwXor<{memarg}>")?, //=> visit_i64_atomic_rmw_Xor
Operator::I32AtomicRmw8XorU { memarg } => write!(f, "i32atomic_rmw8Xoru<{memarg}>")?, //=> visit_i32_atomic_rmw8_Xor_u
Operator::I32AtomicRmw16XorU { memarg } => write!(f, "i32atomic_rmw16Xoru<{memarg}>")?, //=> visit_i32_atomic_rmw16_Xor_u
Operator::I64AtomicRmw8XorU { memarg } => write!(f, "i64atomic_rmw8Xoru<{memarg}>")?, //=> visit_i64_atomic_rmw8_Xor_u
Operator::I64AtomicRmw16XorU { memarg } => write!(f, "i32atomic_rmw16Xoru<{memarg}>")?, //=> visit_i64_atomic_rmw16_Xor_u
Operator::I64AtomicRmw32XorU { memarg } => write!(f, "i32atomic_rmw32Xoru<{memarg}>")?, //=> visit_i64_atomic_rmw32_Xor_u
// Operator::I32AtomicRmwXchg { memarg } => Some(memarg),//=> visit_i32_atomic_rmw_xchg
// Operator::I64AtomicRmwXchg { memarg } => Some(memarg),//=> visit_i64_atomic_rmw_xchg
// Operator::I32AtomicRmw8XchgU { memarg },// => visit_i32_atomic_rmw8_xchg_u
// Operator::I32AtomicRmw16XchgU { memarg },// => visit_i32_atomic_rmw16_xchg_u
// Operator::I64AtomicRmw8XchgU { memarg },// => visit_i64_atomic_rmw8_xchg_u
// Operator::I64AtomicRmw16XchgU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw16_xchg_u
// Operator::I64AtomicRmw32XchgU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw32_xchg_u
Operator::I32AtomicRmwXchg { memarg } => write!(f, "i32atomic_rmwXchg<{memarg}>")?, //=> visit_i32_atomic_rmw_Xchg
Operator::I64AtomicRmwXchg { memarg } => write!(f, "i64atomic_rmwXchg<{memarg}>")?, //=> visit_i64_atomic_rmw_Xchg
Operator::I32AtomicRmw8XchgU { memarg } => write!(f, "i32atomic_rmw8Xchgu<{memarg}>")?, //=> visit_i32_atomic_rmw8_Xchg_u
Operator::I32AtomicRmw16XchgU { memarg } => {
write!(f, "i32atomic_rmw16Xchgu<{memarg}>")?
} //=> visit_i32_atomic_rmw16_Xchg_u
Operator::I64AtomicRmw8XchgU { memarg } => write!(f, "i64atomic_rmw8Xchgu<{memarg}>")?, //=> visit_i64_atomic_rmw8_Xchg_u
Operator::I64AtomicRmw16XchgU { memarg } => {
write!(f, "i32atomic_rmw16Xchgu<{memarg}>")?
} //=> visit_i64_atomic_rmw16_Xchg_u
Operator::I64AtomicRmw32XchgU { memarg } => {
write!(f, "i32atomic_rmw32Xchgu<{memarg}>")?
} //=> visit_i64_atomic_rmw32_Xchg_u
// Operator::I32AtomicRmwCmpxchg { memarg } => Some(memarg),//=> visit_i32_atomic_rmw_cmpxchg
// Operator::I64AtomicRmwCmpxchg { memarg } => Some(memarg),//=> visit_i64_atomic_rmw_cmpxchg
// Operator::I32AtomicRmw8CmpxchgU { memarg },// => visit_i32_atomic_rmw8_cmpxchg_u
// Operator::I32AtomicRmw16CmpxchgU { memarg },// => visit_i32_atomic_rmw16_cmpxchg_u
// Operator::I64AtomicRmw8CmpxchgU { memarg },// => visit_i64_atomic_rmw8_cmpxchg_u
// Operator::I64AtomicRmw16CmpxchgU { memarg },// => visit_i64_atomic_rmw16_cmpxchg_u
// Operator::I64AtomicRmw32CmpxchgU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw32_c
Operator::I32AtomicRmwCmpxchg { memarg } => {
write!(f, "i32atomic_rmwCmpxchg<{memarg}>")?
} //=> visit_i32_atomic_rmw_Cmpxchg
Operator::I64AtomicRmwCmpxchg { memarg } => {
write!(f, "i64atomic_rmwCmpxchg<{memarg}>")?
} //=> visit_i64_atomic_rmw_Cmpxchg
Operator::I32AtomicRmw8CmpxchgU { memarg } => {
write!(f, "i32atomic_rmw8Cmpxchgu<{memarg}>")?
} //=> visit_i32_atomic_rmw8_Cmpxchg_u
Operator::I32AtomicRmw16CmpxchgU { memarg } => {
write!(f, "i32atomic_rmw16Cmpxchgu<{memarg}>")?
} //=> visit_i32_atomic_rmw16_Cmpxchg_u
Operator::I64AtomicRmw8CmpxchgU { memarg } => {
write!(f, "i64atomic_rmw8Cmpxchgu<{memarg}>")?
} //=> visit_i64_atomic_rmw8_Cmpxchg_u
Operator::I64AtomicRmw16CmpxchgU { memarg } => {
write!(f, "i32atomic_rmw16Cmpxchgu<{memarg}>")?
} //=> visit_i64_atomic_rmw16_Cmpxchg_u
Operator::I64AtomicRmw32CmpxchgU { memarg } => {
write!(f, "i32atomic_rmw32Cmpxchgu<{memarg}>")?
} //=> visit_i64_atomic_rmw32_Cmpxchg_u
}
Ok(())
@ -2152,11 +2822,11 @@ pub fn op_rematerialize(op: &Operator) -> bool {
}
}
pub fn rewrite_mem<V,E>(
pub fn rewrite_mem<V, E>(
o: &mut Operator,
v: &mut [V],
mut go: impl FnMut(&mut crate::Memory, Option<&mut V>) -> Result<(),E>,
) -> Result<(),E>{
mut go: impl FnMut(&mut crate::Memory, Option<&mut V>) -> Result<(), E>,
) -> Result<(), E> {
match o {
Operator::I32Load { memory } => go(&mut memory.memory, Some(&mut v[0])),
Operator::I64Load { memory } => go(&mut memory.memory, Some(&mut v[0])),
@ -2212,7 +2882,74 @@ pub fn rewrite_mem<V,E>(
Operator::V128Store16Lane { memory, .. } => go(&mut memory.memory, Some(&mut v[0])),
Operator::V128Store32Lane { memory, .. } => go(&mut memory.memory, Some(&mut v[0])),
Operator::V128Store64Lane { memory, .. } => go(&mut memory.memory, Some(&mut v[0])),
_ => Ok(())
Operator::MemoryAtomicNotify { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_memory_atomic_notify
Operator::MemoryAtomicWait32 { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_memory_atomic_wait32
Operator::MemoryAtomicWait64 { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_memory_atomic_wait64
Operator::I32AtomicLoad { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_load
Operator::I64AtomicLoad { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_load
Operator::I32AtomicLoad8U { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_load8_u
Operator::I32AtomicLoad16U { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_load16_u
Operator::I64AtomicLoad8U { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_load8_u
Operator::I64AtomicLoad16U { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_load16_u
Operator::I64AtomicLoad32U { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_load32_u
Operator::I32AtomicStore { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_store
Operator::I64AtomicStore { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_store
Operator::I32AtomicStore8 { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_store8
Operator::I32AtomicStore16 { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_store16
Operator::I64AtomicStore8 { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_store8
Operator::I64AtomicStore16 { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_store16
Operator::I64AtomicStore32 { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_store32
Operator::I32AtomicRmwAdd { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw_add
Operator::I64AtomicRmwAdd { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw_add
Operator::I32AtomicRmw8AddU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw8_add_u
Operator::I32AtomicRmw16AddU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw16_add_u
Operator::I64AtomicRmw8AddU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw8_add_u
Operator::I64AtomicRmw16AddU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw16_add_u
Operator::I64AtomicRmw32AddU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw32_add_u
Operator::I32AtomicRmwSub { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw_sub
Operator::I64AtomicRmwSub { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw_sub
Operator::I32AtomicRmw8SubU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw8_sub_u
Operator::I32AtomicRmw16SubU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw16_sub_u
Operator::I64AtomicRmw8SubU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw8_sub_u
Operator::I64AtomicRmw16SubU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw16_sub_u
Operator::I64AtomicRmw32SubU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw32_sub_u
Operator::I32AtomicRmwAnd { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw_and
Operator::I64AtomicRmwAnd { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw_and
Operator::I32AtomicRmw8AndU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw8_and_u
Operator::I32AtomicRmw16AndU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw16_and_u
Operator::I64AtomicRmw8AndU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw8_and_u
Operator::I64AtomicRmw16AndU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw16_and_u
Operator::I64AtomicRmw32AndU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw32_and_u
Operator::I32AtomicRmwOr { memarg } => go(&mut memarg.memory, Some(&mut v[0])), // => visit_i32_atomic_rmw_or
Operator::I64AtomicRmwOr { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw_or
Operator::I32AtomicRmw8OrU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw8_or_u
Operator::I32AtomicRmw16OrU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw16_or_u
Operator::I64AtomicRmw8OrU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw8_or_u
Operator::I64AtomicRmw16OrU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw16_or_u
Operator::I64AtomicRmw32OrU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw32_or_u
Operator::I32AtomicRmwXor { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw_xor
Operator::I64AtomicRmwXor { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw_xor
Operator::I32AtomicRmw8XorU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw8_xor_u
Operator::I32AtomicRmw16XorU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw16_xor_u
Operator::I64AtomicRmw8XorU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw8_xor_u
Operator::I64AtomicRmw16XorU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw16_xor_u
Operator::I64AtomicRmw32XorU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw32_xor_u
Operator::I32AtomicRmwXchg { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw_xchg
Operator::I64AtomicRmwXchg { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw_xchg
Operator::I32AtomicRmw8XchgU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), // => visit_i32_atomic_rmw8_xchg_u
Operator::I32AtomicRmw16XchgU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), // => visit_i32_atomic_rmw16_xchg_u
Operator::I64AtomicRmw8XchgU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), // => visit_i64_atomic_rmw8_xchg_u
Operator::I64AtomicRmw16XchgU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw16_xchg_u
Operator::I64AtomicRmw32XchgU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw32_xchg_u
Operator::I32AtomicRmwCmpxchg { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i32_atomic_rmw_cmpxchg
Operator::I64AtomicRmwCmpxchg { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw_cmpxchg
Operator::I32AtomicRmw8CmpxchgU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), // => visit_i32_atomic_rmw8_cmpxchg_u
Operator::I32AtomicRmw16CmpxchgU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), // => visit_i32_atomic_rmw16_cmpxchg_u
Operator::I64AtomicRmw8CmpxchgU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), // => visit_i64_atomic_rmw8_cmpxchg_u
Operator::I64AtomicRmw16CmpxchgU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), // => visit_i64_atomic_rmw16_cmpxchg_u
Operator::I64AtomicRmw32CmpxchgU { memarg } => go(&mut memarg.memory, Some(&mut v[0])), //=> visit_i64_atomic_rmw32_c
_ => Ok(()),
}
}
pub fn mem_count(o: &Operator) -> usize {
@ -2267,11 +3004,14 @@ pub fn mem_count(o: &Operator) -> usize {
Operator::V128Store16Lane { memory, .. } => 1,
Operator::V128Store32Lane { memory, .. } => 1,
Operator::V128Store64Lane { memory, .. } => 1,
_ => 0,
_ => match memory_arg(o) {
None => 0,
Some(_) => 1,
},
}
}
pub fn memory_arg(o: &Operator) -> Option<&MemoryArg>{
match o{
pub fn memory_arg(o: &Operator) -> Option<&MemoryArg> {
match o {
Operator::I32Load { memory } => Some(memory),
Operator::I64Load { memory } => Some(memory),
Operator::F32Load { memory } => Some(memory),
@ -2318,6 +3058,72 @@ pub fn memory_arg(o: &Operator) -> Option<&MemoryArg>{
Operator::V128Store16Lane { memory, .. } => Some(memory),
Operator::V128Store32Lane { memory, .. } => Some(memory),
Operator::V128Store64Lane { memory, .. } => Some(memory),
_ => None
Operator::MemoryAtomicNotify { memarg } => Some(memarg), //=> visit_memory_atomic_notify
Operator::MemoryAtomicWait32 { memarg } => Some(memarg), //=> visit_memory_atomic_wait32
Operator::MemoryAtomicWait64 { memarg } => Some(memarg), //=> visit_memory_atomic_wait64
Operator::I32AtomicLoad { memarg } => Some(memarg), //=> visit_i32_atomic_load
Operator::I64AtomicLoad { memarg } => Some(memarg), //=> visit_i64_atomic_load
Operator::I32AtomicLoad8U { memarg } => Some(memarg), //=> visit_i32_atomic_load8_u
Operator::I32AtomicLoad16U { memarg } => Some(memarg), //=> visit_i32_atomic_load16_u
Operator::I64AtomicLoad8U { memarg } => Some(memarg), //=> visit_i64_atomic_load8_u
Operator::I64AtomicLoad16U { memarg } => Some(memarg), //=> visit_i64_atomic_load16_u
Operator::I64AtomicLoad32U { memarg } => Some(memarg), //=> visit_i64_atomic_load32_u
Operator::I32AtomicStore { memarg } => Some(memarg), //=> visit_i32_atomic_store
Operator::I64AtomicStore { memarg } => Some(memarg), //=> visit_i64_atomic_store
Operator::I32AtomicStore8 { memarg } => Some(memarg), //=> visit_i32_atomic_store8
Operator::I32AtomicStore16 { memarg } => Some(memarg), //=> visit_i32_atomic_store16
Operator::I64AtomicStore8 { memarg } => Some(memarg), //=> visit_i64_atomic_store8
Operator::I64AtomicStore16 { memarg } => Some(memarg), //=> visit_i64_atomic_store16
Operator::I64AtomicStore32 { memarg } => Some(memarg), //=> visit_i64_atomic_store32
Operator::I32AtomicRmwAdd { memarg } => Some(memarg), //=> visit_i32_atomic_rmw_add
Operator::I64AtomicRmwAdd { memarg } => Some(memarg), //=> visit_i64_atomic_rmw_add
Operator::I32AtomicRmw8AddU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw8_add_u
Operator::I32AtomicRmw16AddU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw16_add_u
Operator::I64AtomicRmw8AddU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw8_add_u
Operator::I64AtomicRmw16AddU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw16_add_u
Operator::I64AtomicRmw32AddU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw32_add_u
Operator::I32AtomicRmwSub { memarg } => Some(memarg), //=> visit_i32_atomic_rmw_sub
Operator::I64AtomicRmwSub { memarg } => Some(memarg), //=> visit_i64_atomic_rmw_sub
Operator::I32AtomicRmw8SubU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw8_sub_u
Operator::I32AtomicRmw16SubU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw16_sub_u
Operator::I64AtomicRmw8SubU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw8_sub_u
Operator::I64AtomicRmw16SubU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw16_sub_u
Operator::I64AtomicRmw32SubU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw32_sub_u
Operator::I32AtomicRmwAnd { memarg } => Some(memarg), //=> visit_i32_atomic_rmw_and
Operator::I64AtomicRmwAnd { memarg } => Some(memarg), //=> visit_i64_atomic_rmw_and
Operator::I32AtomicRmw8AndU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw8_and_u
Operator::I32AtomicRmw16AndU { memarg } => Some(memarg), //=> visit_i32_atomic_rmw16_and_u
Operator::I64AtomicRmw8AndU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw8_and_u
Operator::I64AtomicRmw16AndU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw16_and_u
Operator::I64AtomicRmw32AndU { memarg } => Some(memarg), //=> visit_i64_atomic_rmw32_and_u
Operator::I32AtomicRmwOr { memarg } => Some(memarg), // => visit_i32_atomic_rmw_or
Operator::I64AtomicRmwOr { memarg } => Some(memarg),//=> visit_i64_atomic_rmw_or
Operator::I32AtomicRmw8OrU { memarg } => Some(memarg),//=> visit_i32_atomic_rmw8_or_u
Operator::I32AtomicRmw16OrU { memarg } => Some(memarg),//=> visit_i32_atomic_rmw16_or_u
Operator::I64AtomicRmw8OrU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw8_or_u
Operator::I64AtomicRmw16OrU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw16_or_u
Operator::I64AtomicRmw32OrU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw32_or_u
Operator::I32AtomicRmwXor { memarg } => Some(memarg),//=> visit_i32_atomic_rmw_xor
Operator::I64AtomicRmwXor { memarg } => Some(memarg),//=> visit_i64_atomic_rmw_xor
Operator::I32AtomicRmw8XorU { memarg } => Some(memarg),//=> visit_i32_atomic_rmw8_xor_u
Operator::I32AtomicRmw16XorU { memarg } => Some(memarg),//=> visit_i32_atomic_rmw16_xor_u
Operator::I64AtomicRmw8XorU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw8_xor_u
Operator::I64AtomicRmw16XorU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw16_xor_u
Operator::I64AtomicRmw32XorU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw32_xor_u
Operator::I32AtomicRmwXchg { memarg } => Some(memarg),//=> visit_i32_atomic_rmw_xchg
Operator::I64AtomicRmwXchg { memarg } => Some(memarg),//=> visit_i64_atomic_rmw_xchg
Operator::I32AtomicRmw8XchgU { memarg }=> Some(memarg),// => visit_i32_atomic_rmw8_xchg_u
Operator::I32AtomicRmw16XchgU { memarg }=> Some(memarg),// => visit_i32_atomic_rmw16_xchg_u
Operator::I64AtomicRmw8XchgU { memarg }=> Some(memarg),// => visit_i64_atomic_rmw8_xchg_u
Operator::I64AtomicRmw16XchgU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw16_xchg_u
Operator::I64AtomicRmw32XchgU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw32_xchg_u
Operator::I32AtomicRmwCmpxchg { memarg } => Some(memarg),//=> visit_i32_atomic_rmw_cmpxchg
Operator::I64AtomicRmwCmpxchg { memarg } => Some(memarg),//=> visit_i64_atomic_rmw_cmpxchg
Operator::I32AtomicRmw8CmpxchgU { memarg }=> Some(memarg),// => visit_i32_atomic_rmw8_cmpxchg_u
Operator::I32AtomicRmw16CmpxchgU { memarg }=> Some(memarg),// => visit_i32_atomic_rmw16_cmpxchg_u
Operator::I64AtomicRmw8CmpxchgU { memarg }=> Some(memarg),// => visit_i64_atomic_rmw8_cmpxchg_u
Operator::I64AtomicRmw16CmpxchgU { memarg }=> Some(memarg),// => visit_i64_atomic_rmw16_cmpxchg_u
Operator::I64AtomicRmw32CmpxchgU { memarg } => Some(memarg),//=> visit_i64_atomic_rmw32_c
_ => None,
}
}
}

View file

@ -650,6 +650,73 @@ pub enum Operator {
MemoryFill {
mem: Memory,
},
MemoryAtomicNotify { memarg: MemoryArg } , //=> visit_memory_atomic_notify
MemoryAtomicWait32 { memarg: MemoryArg } , //=> visit_memory_atomic_wait32
MemoryAtomicWait64 { memarg: MemoryArg } , //=> visit_memory_atomic_wait64
AtomicFence, // => visit_atomic_fence
I32AtomicLoad { memarg: MemoryArg } , //=> visit_i32_atomic_load
I64AtomicLoad { memarg: MemoryArg } , //=> visit_i64_atomic_load
I32AtomicLoad8U { memarg: MemoryArg } , //=> visit_i32_atomic_load8_u
I32AtomicLoad16U { memarg: MemoryArg } , //=> visit_i32_atomic_load16_u
I64AtomicLoad8U { memarg: MemoryArg } , //=> visit_i64_atomic_load8_u
I64AtomicLoad16U { memarg: MemoryArg } , //=> visit_i64_atomic_load16_u
I64AtomicLoad32U { memarg: MemoryArg } , //=> visit_i64_atomic_load32_u
I32AtomicStore { memarg: MemoryArg } , //=> visit_i32_atomic_store
I64AtomicStore { memarg: MemoryArg } , //=> visit_i64_atomic_store
I32AtomicStore8 { memarg: MemoryArg } , //=> visit_i32_atomic_store8
I32AtomicStore16 { memarg: MemoryArg } , //=> visit_i32_atomic_store16
I64AtomicStore8 { memarg: MemoryArg } , //=> visit_i64_atomic_store8
I64AtomicStore16 { memarg: MemoryArg } , //=> visit_i64_atomic_store16
I64AtomicStore32 { memarg: MemoryArg } , //=> visit_i64_atomic_store32
I32AtomicRmwAdd { memarg: MemoryArg } , //=> visit_i32_atomic_rmw_add
I64AtomicRmwAdd { memarg: MemoryArg } , //=> visit_i64_atomic_rmw_add
I32AtomicRmw8AddU { memarg: MemoryArg } , //=> visit_i32_atomic_rmw8_add_u
I32AtomicRmw16AddU { memarg: MemoryArg } , //=> visit_i32_atomic_rmw16_add_u
I64AtomicRmw8AddU { memarg: MemoryArg } , //=> visit_i64_atomic_rmw8_add_u
I64AtomicRmw16AddU { memarg: MemoryArg } , //=> visit_i64_atomic_rmw16_add_u
I64AtomicRmw32AddU { memarg: MemoryArg } , //=> visit_i64_atomic_rmw32_add_u
I32AtomicRmwSub { memarg: MemoryArg } , //=> visit_i32_atomic_rmw_sub
I64AtomicRmwSub { memarg: MemoryArg } , //=> visit_i64_atomic_rmw_sub
I32AtomicRmw8SubU { memarg: MemoryArg } , //=> visit_i32_atomic_rmw8_sub_u
I32AtomicRmw16SubU { memarg: MemoryArg } , //=> visit_i32_atomic_rmw16_sub_u
I64AtomicRmw8SubU { memarg: MemoryArg } , //=> visit_i64_atomic_rmw8_sub_u
I64AtomicRmw16SubU { memarg: MemoryArg } , //=> visit_i64_atomic_rmw16_sub_u
I64AtomicRmw32SubU { memarg: MemoryArg } , //=> visit_i64_atomic_rmw32_sub_u
I32AtomicRmwAnd { memarg: MemoryArg } , //=> visit_i32_atomic_rmw_and
I64AtomicRmwAnd { memarg: MemoryArg } , //=> visit_i64_atomic_rmw_and
I32AtomicRmw8AndU { memarg: MemoryArg } , //=> visit_i32_atomic_rmw8_and_u
I32AtomicRmw16AndU { memarg: MemoryArg } , //=> visit_i32_atomic_rmw16_and_u
I64AtomicRmw8AndU { memarg: MemoryArg } , //=> visit_i64_atomic_rmw8_and_u
I64AtomicRmw16AndU { memarg: MemoryArg } , //=> visit_i64_atomic_rmw16_and_u
I64AtomicRmw32AndU { memarg: MemoryArg } , //=> visit_i64_atomic_rmw32_and_u
I32AtomicRmwOr { memarg: MemoryArg }, // => visit_i32_atomic_rmw_or
I64AtomicRmwOr { memarg: MemoryArg } ,//=> visit_i64_atomic_rmw_or
I32AtomicRmw8OrU { memarg: MemoryArg } ,//=> visit_i32_atomic_rmw8_or_u
I32AtomicRmw16OrU { memarg: MemoryArg } ,//=> visit_i32_atomic_rmw16_or_u
I64AtomicRmw8OrU { memarg: MemoryArg } ,//=> visit_i64_atomic_rmw8_or_u
I64AtomicRmw16OrU { memarg: MemoryArg } ,//=> visit_i64_atomic_rmw16_or_u
I64AtomicRmw32OrU { memarg: MemoryArg } ,//=> visit_i64_atomic_rmw32_or_u
I32AtomicRmwXor { memarg: MemoryArg } ,//=> visit_i32_atomic_rmw_xor
I64AtomicRmwXor { memarg: MemoryArg } ,//=> visit_i64_atomic_rmw_xor
I32AtomicRmw8XorU { memarg: MemoryArg } ,//=> visit_i32_atomic_rmw8_xor_u
I32AtomicRmw16XorU { memarg: MemoryArg } ,//=> visit_i32_atomic_rmw16_xor_u
I64AtomicRmw8XorU { memarg: MemoryArg } ,//=> visit_i64_atomic_rmw8_xor_u
I64AtomicRmw16XorU { memarg: MemoryArg } ,//=> visit_i64_atomic_rmw16_xor_u
I64AtomicRmw32XorU { memarg: MemoryArg } ,//=> visit_i64_atomic_rmw32_xor_u
I32AtomicRmwXchg { memarg: MemoryArg } ,//=> visit_i32_atomic_rmw_xchg
I64AtomicRmwXchg { memarg: MemoryArg } ,//=> visit_i64_atomic_rmw_xchg
I32AtomicRmw8XchgU { memarg: MemoryArg },// => visit_i32_atomic_rmw8_xchg_u
I32AtomicRmw16XchgU { memarg: MemoryArg },// => visit_i32_atomic_rmw16_xchg_u
I64AtomicRmw8XchgU { memarg: MemoryArg },// => visit_i64_atomic_rmw8_xchg_u
I64AtomicRmw16XchgU { memarg: MemoryArg } ,//=> visit_i64_atomic_rmw16_xchg_u
I64AtomicRmw32XchgU { memarg: MemoryArg } ,//=> visit_i64_atomic_rmw32_xchg_u
I32AtomicRmwCmpxchg { memarg: MemoryArg } ,//=> visit_i32_atomic_rmw_cmpxchg
I64AtomicRmwCmpxchg { memarg: MemoryArg } ,//=> visit_i64_atomic_rmw_cmpxchg
I32AtomicRmw8CmpxchgU { memarg: MemoryArg },// => visit_i32_atomic_rmw8_cmpxchg_u
I32AtomicRmw16CmpxchgU { memarg: MemoryArg },// => visit_i32_atomic_rmw16_cmpxchg_u
I64AtomicRmw8CmpxchgU { memarg: MemoryArg },// => visit_i64_atomic_rmw8_cmpxchg_u
I64AtomicRmw16CmpxchgU { memarg: MemoryArg },// => visit_i64_atomic_rmw16_cmpxchg_u
I64AtomicRmw32CmpxchgU { memarg: MemoryArg } ,//=> visit_i64_atomic_rmw32_c
}
#[test]
@ -1297,6 +1364,129 @@ impl<'a, 'b> std::convert::TryFrom<&'b wasmparser::Operator<'a>> for Operator {
&wasmparser::Operator::RefNull { hty } => Ok(Operator::RefNull {
ty: wasmparser::RefType::new(true, hty).unwrap().into(),
}),
&wasmparser::Operator:: MemoryAtomicNotify { memarg } => Ok(Operator::MemoryAtomicNotify { memarg: memarg.into() }),
&wasmparser::Operator:: MemoryAtomicWait32 { memarg } => Ok(Operator::MemoryAtomicWait32 { memarg: memarg.into() }),
&wasmparser::Operator:: MemoryAtomicWait64 { memarg } => Ok(Operator::MemoryAtomicWait64 { memarg: memarg.into() }),
&wasmparser::Operator:: AtomicFence => Ok(Operator::AtomicFence),
&wasmparser::Operator:: I32AtomicLoad { memarg } => Ok(Operator::I32AtomicLoad { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicLoad { memarg } => Ok(Operator::I64AtomicLoad { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicLoad8U { memarg } => Ok(Operator::I32AtomicLoad8U { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicLoad16U { memarg } => Ok(Operator::I32AtomicLoad16U { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicLoad8U { memarg } => Ok(Operator::I64AtomicLoad8U { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicLoad16U { memarg } => Ok(Operator::I64AtomicLoad16U { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicLoad32U { memarg } => Ok(Operator::I64AtomicLoad32U { memarg: memarg.into() }),
// &wasmparser::Operator:: I32AtomicStore { memarg } => visit_i32_atomic_store
// &wasmparser::Operator:: I64AtomicStore { memarg } => visit_i64_atomic_store
// &wasmparser::Operator:: I32AtomicStore8 { memarg } => visit_i32_atomic_store8
// &wasmparser::Operator:: I32AtomicStore16 { memarg } => visit_i32_atomic_store16
// &wasmparser::Operator:: I64AtomicStore8 { memarg } => visit_i64_atomic_store8
// &wasmparser::Operator:: I64AtomicStore16 { memarg } => visit_i64_atomic_store16
// &wasmparser::Operator:: I64AtomicStore32 { memarg } => visit_i64_atomic_store32
&wasmparser::Operator:: I32AtomicStore { memarg } => Ok(Operator::I32AtomicStore { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicStore { memarg } => Ok(Operator::I64AtomicStore { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicStore8 { memarg } => Ok(Operator::I32AtomicStore8 { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicStore16 { memarg } => Ok(Operator::I32AtomicStore16 { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicStore8 { memarg } => Ok(Operator::I64AtomicStore8 { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicStore16 { memarg } => Ok(Operator::I64AtomicStore16 { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicStore32 { memarg } => Ok(Operator::I64AtomicStore32 { memarg: memarg.into() }),
// &wasmparser::Operator:: I32AtomicRmwAdd { memarg } => visit_i32_atomic_rmw_add
// &wasmparser::Operator:: I64AtomicRmwAdd { memarg } => visit_i64_atomic_rmw_add
// &wasmparser::Operator:: I32AtomicRmw8AddU { memarg } => visit_i32_atomic_rmw8_add_u
// &wasmparser::Operator:: I32AtomicRmw16AddU { memarg } => visit_i32_atomic_rmw16_add_u
// &wasmparser::Operator:: I64AtomicRmw8AddU { memarg } => visit_i64_atomic_rmw8_add_u
// &wasmparser::Operator:: I64AtomicRmw16AddU { memarg } => visit_i64_atomic_rmw16_add_u
// &wasmparser::Operator:: I64AtomicRmw32AddU { memarg } => visit_i64_atomic_rmw32_add_u
&wasmparser::Operator:: I32AtomicRmwAdd { memarg } => Ok(Operator::I32AtomicRmwAdd { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmwAdd { memarg } => Ok(Operator::I64AtomicRmwAdd { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw8AddU { memarg } => Ok(Operator::I32AtomicRmw8AddU { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw16AddU { memarg } => Ok(Operator::I32AtomicRmw16AddU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw8AddU { memarg } => Ok(Operator::I64AtomicRmw8AddU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw16AddU { memarg } => Ok(Operator::I64AtomicRmw16AddU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw32AddU { memarg } => Ok(Operator::I64AtomicRmw32AddU { memarg: memarg.into() }),
// &wasmparser::Operator:: I32AtomicRmwSub { memarg } => visit_i32_atomic_rmw_sub
// &wasmparser::Operator:: I64AtomicRmwSub { memarg } => visit_i64_atomic_rmw_sub
// &wasmparser::Operator:: I32AtomicRmw8SubU { memarg } => visit_i32_atomic_rmw8_sub_u
// &wasmparser::Operator:: I32AtomicRmw16SubU { memarg } => visit_i32_atomic_rmw16_sub_u
// &wasmparser::Operator:: I64AtomicRmw8SubU { memarg } => visit_i64_atomic_rmw8_sub_u
// &wasmparser::Operator:: I64AtomicRmw16SubU { memarg } => visit_i64_atomic_rmw16_sub_u
// &wasmparser::Operator:: I64AtomicRmw32SubU { memarg } => visit_i64_atomic_rmw32_sub_u
&wasmparser::Operator:: I32AtomicRmwSub { memarg } => Ok(Operator::I32AtomicRmwSub { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmwSub { memarg } => Ok(Operator::I64AtomicRmwSub { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw8SubU { memarg } => Ok(Operator::I32AtomicRmw8SubU { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw16SubU { memarg } => Ok(Operator::I32AtomicRmw16SubU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw8SubU { memarg } => Ok(Operator::I64AtomicRmw8SubU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw16SubU { memarg } => Ok(Operator::I64AtomicRmw16SubU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw32SubU { memarg } => Ok(Operator::I64AtomicRmw32SubU { memarg: memarg.into() }),
// &wasmparser::Operator:: I32AtomicRmwAnd { memarg } => visit_i32_atomic_rmw_and
// &wasmparser::Operator:: I64AtomicRmwAnd { memarg } => visit_i64_atomic_rmw_and
// &wasmparser::Operator:: I32AtomicRmw8AndU { memarg } => visit_i32_atomic_rmw8_and_u
// &wasmparser::Operator:: I32AtomicRmw16AndU { memarg } => visit_i32_atomic_rmw16_and_u
// &wasmparser::Operator:: I64AtomicRmw8AndU { memarg } => visit_i64_atomic_rmw8_and_u
// &wasmparser::Operator:: I64AtomicRmw16AndU { memarg } => visit_i64_atomic_rmw16_and_u
// &wasmparser::Operator:: I64AtomicRmw32AndU { memarg } => visit_i64_atomic_rmw32_and_u
&wasmparser::Operator:: I32AtomicRmwAnd { memarg } => Ok(Operator::I32AtomicRmwAnd { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmwAnd { memarg } => Ok(Operator::I64AtomicRmwAnd { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw8AndU { memarg } => Ok(Operator::I32AtomicRmw8AndU { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw16AndU { memarg } => Ok(Operator::I32AtomicRmw16AndU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw8AndU { memarg } => Ok(Operator::I64AtomicRmw8AndU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw16AndU { memarg } => Ok(Operator::I64AtomicRmw16AndU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw32AndU { memarg } => Ok(Operator::I64AtomicRmw32AndU { memarg: memarg.into() }),
// &wasmparser::Operator:: I32AtomicRmwOr { memarg } => visit_i32_atomic_rmw_or
// &wasmparser::Operator:: I64AtomicRmwOr { memarg } => visit_i64_atomic_rmw_or
// &wasmparser::Operator:: I32AtomicRmw8OrU { memarg } => visit_i32_atomic_rmw8_or_u
// &wasmparser::Operator:: I32AtomicRmw16OrU { memarg } => visit_i32_atomic_rmw16_or_u
// &wasmparser::Operator:: I64AtomicRmw8OrU { memarg } => visit_i64_atomic_rmw8_or_u
// &wasmparser::Operator:: I64AtomicRmw16OrU { memarg } => visit_i64_atomic_rmw16_or_u
// &wasmparser::Operator:: I64AtomicRmw32OrU { memarg } => visit_i64_atomic_rmw32_or_u
&wasmparser::Operator:: I32AtomicRmwOr { memarg } => Ok(Operator::I32AtomicRmwOr { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmwOr { memarg } => Ok(Operator::I64AtomicRmwOr { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw8OrU { memarg } => Ok(Operator::I32AtomicRmw8OrU { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw16OrU { memarg } => Ok(Operator::I32AtomicRmw16OrU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw8OrU { memarg } => Ok(Operator::I64AtomicRmw8OrU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw16OrU { memarg } => Ok(Operator::I64AtomicRmw16OrU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw32OrU { memarg } => Ok(Operator::I64AtomicRmw32OrU { memarg: memarg.into() }),
// &wasmparser::Operator:: I32AtomicRmwXor { memarg } => visit_i32_atomic_rmw_xor
// &wasmparser::Operator:: I64AtomicRmwXor { memarg } => visit_i64_atomic_rmw_xor
// &wasmparser::Operator:: I32AtomicRmw8XorU { memarg } => visit_i32_atomic_rmw8_xor_u
// &wasmparser::Operator:: I32AtomicRmw16XorU { memarg } => visit_i32_atomic_rmw16_xor_u
// &wasmparser::Operator:: I64AtomicRmw8XorU { memarg } => visit_i64_atomic_rmw8_xor_u
// &wasmparser::Operator:: I64AtomicRmw16XorU { memarg } => visit_i64_atomic_rmw16_xor_u
// &wasmparser::Operator:: I64AtomicRmw32XorU { memarg } => visit_i64_atomic_rmw32_xor_u
&wasmparser::Operator:: I32AtomicRmwXor { memarg } => Ok(Operator::I32AtomicRmwXor { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmwXor { memarg } => Ok(Operator::I64AtomicRmwXor { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw8XorU { memarg } => Ok(Operator::I32AtomicRmw8XorU { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw16XorU { memarg } => Ok(Operator::I32AtomicRmw16XorU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw8XorU { memarg } => Ok(Operator::I64AtomicRmw8XorU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw16XorU { memarg } => Ok(Operator::I64AtomicRmw16XorU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw32XorU { memarg } => Ok(Operator::I64AtomicRmw32XorU { memarg: memarg.into() }),
// &wasmparser::Operator:: I32AtomicRmwXchg { memarg } => visit_i32_atomic_rmw_xchg
// &wasmparser::Operator:: I64AtomicRmwXchg { memarg } => visit_i64_atomic_rmw_xchg
// &wasmparser::Operator:: I32AtomicRmw8XchgU { memarg } => visit_i32_atomic_rmw8_xchg_u
// &wasmparser::Operator:: I32AtomicRmw16XchgU { memarg } => visit_i32_atomic_rmw16_xchg_u
// &wasmparser::Operator:: I64AtomicRmw8XchgU { memarg } => visit_i64_atomic_rmw8_xchg_u
// &wasmparser::Operator:: I64AtomicRmw16XchgU { memarg } => visit_i64_atomic_rmw16_xchg_u
// &wasmparser::Operator:: I64AtomicRmw32XchgU { memarg } => visit_i64_atomic_rmw32_xchg_u
&wasmparser::Operator:: I32AtomicRmwXchg { memarg } => Ok(Operator::I32AtomicRmwXchg { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmwXchg { memarg } => Ok(Operator::I64AtomicRmwXchg { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw8XchgU { memarg } => Ok(Operator::I32AtomicRmw8XchgU { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw16XchgU { memarg } => Ok(Operator::I32AtomicRmw16XchgU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw8XchgU { memarg } => Ok(Operator::I64AtomicRmw8XchgU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw16XchgU { memarg } => Ok(Operator::I64AtomicRmw16XchgU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw32XchgU { memarg } => Ok(Operator::I64AtomicRmw32XchgU { memarg: memarg.into() }),
// &wasmparser::Operator:: I32AtomicRmwCmpxchg { memarg } => visit_i32_atomic_rmw_cmpxchg
// &wasmparser::Operator:: I64AtomicRmwCmpxchg { memarg } => visit_i64_atomic_rmw_cmpxchg
// &wasmparser::Operator:: I32AtomicRmw8CmpxchgU { memarg } => visit_i32_atomic_rmw8_cmpxchg_u
// &wasmparser::Operator:: I32AtomicRmw16CmpxchgU { memarg } => visit_i32_atomic_rmw16_cmpxchg_u
// &wasmparser::Operator:: I64AtomicRmw8CmpxchgU { memarg } => visit_i64_atomic_rmw8_cmpxchg_u
// &wasmparser::Operator:: I64AtomicRmw16CmpxchgU { memarg } => visit_i64_atomic_rmw16_cmpxchg_u
// &wasmparser::Operator:: I64AtomicRmw32CmpxchgU { memarg } => visit_i64_atomic_rmw32_cmpxchg_u
&wasmparser::Operator:: I32AtomicRmwCmpxchg { memarg } => Ok(Operator::I32AtomicRmwCmpxchg { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmwCmpxchg { memarg } => Ok(Operator::I64AtomicRmwCmpxchg { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw8CmpxchgU { memarg } => Ok(Operator::I32AtomicRmw8CmpxchgU { memarg: memarg.into() }),
&wasmparser::Operator:: I32AtomicRmw16CmpxchgU { memarg } => Ok(Operator::I32AtomicRmw16CmpxchgU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw8CmpxchgU { memarg } => Ok(Operator::I64AtomicRmw8CmpxchgU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw16CmpxchgU { memarg } => Ok(Operator::I64AtomicRmw16CmpxchgU { memarg: memarg.into() }),
&wasmparser::Operator:: I64AtomicRmw32CmpxchgU { memarg } => Ok(Operator::I64AtomicRmw32CmpxchgU { memarg: memarg.into() }),
_ => Err(()),
}
}

View file

@ -105,6 +105,7 @@ pub fn metafuse_all(m: &mut Module, cfg: &mut impl Cfg) {
.rev()
{
let memory64 = mem.1.memory64;
let shared = mem.1.shared;
b.insert(
mem.0,
std::mem::replace(
@ -114,6 +115,7 @@ pub fn metafuse_all(m: &mut Module, cfg: &mut impl Cfg) {
maximum_pages: None,
segments: vec![],
memory64,
shared
},
),
);