waffle/src/frontend.rs

38 lines
940 B
Rust
Raw Normal View History

//! Frontend: convert Wasm to IR.
use crate::ir::*;
2021-11-13 08:56:49 +00:00
use anyhow::Result;
use log::trace;
use wasmparser::{Parser, Payload, TypeDef};
pub fn wasm_to_ir(bytes: &[u8]) -> Result<Module> {
let mut module = Module::default();
2021-11-13 08:56:49 +00:00
let parser = Parser::new(0);
for payload in parser.parse_all(bytes) {
let payload = payload?;
handle_payload(&mut module, payload)?;
}
Ok(module)
}
fn handle_payload<'a>(module: &mut Module, payload: Payload<'a>) -> Result<()> {
2021-11-13 08:56:49 +00:00
trace!("Wasm parser item: {:?}", payload);
match payload {
Payload::TypeSection(mut reader) => {
for _ in 0..reader.get_count() {
let ty = reader.read()?;
match ty {
TypeDef::Func(fty) => {
module.signatures.push(fty);
}
_ => {}
}
}
}
_ => {}
}
Ok(())
}