Add memory index support in analysis

This commit is contained in:
Rerumu 2023-06-24 19:05:00 -04:00
parent 460363bff1
commit 5622aa661e
2 changed files with 30 additions and 6 deletions

View File

@ -1,7 +1,10 @@
use std::collections::BTreeSet; use std::collections::BTreeSet;
use wasm_ast::{ use wasm_ast::{
node::{BinOp, CmpOp, FuncData, LoadAt, MemoryGrow, MemorySize, StoreAt, UnOp}, node::{
BinOp, CmpOp, FuncData, LoadAt, MemoryCopy, MemoryFill, MemoryGrow, MemorySize, StoreAt,
UnOp,
},
visit::{Driver, Visitor}, visit::{Driver, Visitor},
}; };
@ -16,14 +19,14 @@ impl Visitor for Visit {
fn visit_load_at(&mut self, v: &LoadAt) { fn visit_load_at(&mut self, v: &LoadAt) {
let name = v.load_type().as_name(); let name = v.load_type().as_name();
self.memory_set.insert(0); self.memory_set.insert(v.memory());
self.local_set.insert(("load", name)); self.local_set.insert(("load", name));
} }
fn visit_store_at(&mut self, v: &StoreAt) { fn visit_store_at(&mut self, v: &StoreAt) {
let name = v.store_type().as_name(); let name = v.store_type().as_name();
self.memory_set.insert(0); self.memory_set.insert(v.memory());
self.local_set.insert(("store", name)); self.local_set.insert(("store", name));
} }
@ -60,6 +63,15 @@ impl Visitor for Visit {
fn visit_memory_grow(&mut self, m: &MemoryGrow) { fn visit_memory_grow(&mut self, m: &MemoryGrow) {
self.memory_set.insert(m.memory()); self.memory_set.insert(m.memory());
} }
fn visit_memory_copy(&mut self, m: &MemoryCopy) {
self.memory_set.insert(m.destination().memory());
self.memory_set.insert(m.source().memory());
}
fn visit_memory_fill(&mut self, m: &MemoryFill) {
self.memory_set.insert(m.destination().memory());
}
} }
pub fn visit(ast: &FuncData) -> (BTreeSet<(&'static str, &'static str)>, BTreeSet<usize>) { pub fn visit(ast: &FuncData) -> (BTreeSet<(&'static str, &'static str)>, BTreeSet<usize>) {

View File

@ -1,7 +1,10 @@
use std::collections::BTreeSet; use std::collections::BTreeSet;
use wasm_ast::{ use wasm_ast::{
node::{BinOp, CmpOp, FuncData, LoadAt, MemoryGrow, MemorySize, StoreAt, UnOp, Value}, node::{
BinOp, CmpOp, FuncData, LoadAt, MemoryCopy, MemoryFill, MemoryGrow, MemorySize, StoreAt,
UnOp, Value,
},
visit::{Driver, Visitor}, visit::{Driver, Visitor},
}; };
use wasmparser::ValType; use wasmparser::ValType;
@ -17,14 +20,14 @@ impl Visitor for Visit {
fn visit_load_at(&mut self, v: &LoadAt) { fn visit_load_at(&mut self, v: &LoadAt) {
let name = v.load_type().as_name(); let name = v.load_type().as_name();
self.memory_set.insert(0); self.memory_set.insert(v.memory());
self.local_set.insert(("load", name)); self.local_set.insert(("load", name));
} }
fn visit_store_at(&mut self, v: &StoreAt) { fn visit_store_at(&mut self, v: &StoreAt) {
let name = v.store_type().as_name(); let name = v.store_type().as_name();
self.memory_set.insert(0); self.memory_set.insert(v.memory());
self.local_set.insert(("store", name)); self.local_set.insert(("store", name));
} }
@ -72,6 +75,15 @@ impl Visitor for Visit {
fn visit_memory_grow(&mut self, m: &MemoryGrow) { fn visit_memory_grow(&mut self, m: &MemoryGrow) {
self.memory_set.insert(m.memory()); self.memory_set.insert(m.memory());
} }
fn visit_memory_copy(&mut self, m: &MemoryCopy) {
self.memory_set.insert(m.destination().memory());
self.memory_set.insert(m.source().memory());
}
fn visit_memory_fill(&mut self, m: &MemoryFill) {
self.memory_set.insert(m.destination().memory());
}
} }
pub fn visit(ast: &FuncData) -> (BTreeSet<(&'static str, &'static str)>, BTreeSet<usize>) { pub fn visit(ast: &FuncData) -> (BTreeSet<(&'static str, &'static str)>, BTreeSet<usize>) {