waffle/src/ir.rs

103 lines
2 KiB
Rust
Raw Normal View History

2021-11-13 06:16:54 +00:00
//! Intermediate representation for Wasm.
use wasmparser::{FuncType, Operator, Type};
2021-11-13 06:16:54 +00:00
pub type SignatureId = usize;
pub type FuncId = usize;
2021-11-13 08:20:02 +00:00
pub type BlockId = usize;
pub type InstId = usize;
pub type ValueId = usize;
2021-11-13 06:16:54 +00:00
#[derive(Clone, Debug, Default)]
2021-11-13 10:32:05 +00:00
pub struct Module<'a> {
pub funcs: Vec<FuncDecl<'a>>,
2021-11-13 06:16:54 +00:00
pub signatures: Vec<FuncType>,
}
#[derive(Clone, Debug)]
2021-11-13 10:32:05 +00:00
pub enum FuncDecl<'a> {
2021-11-13 06:16:54 +00:00
Import(SignatureId),
2021-11-13 10:32:05 +00:00
Body(SignatureId, FunctionBody<'a>),
}
impl<'a> FuncDecl<'a> {
pub fn sig(&self) -> SignatureId {
match self {
2021-11-13 11:49:19 +00:00
FuncDecl::Import(sig) => *sig,
FuncDecl::Body(sig, ..) => *sig,
2021-11-13 10:32:05 +00:00
}
}
2021-11-13 06:16:54 +00:00
}
#[derive(Clone, Debug, Default)]
2021-11-13 10:32:05 +00:00
pub struct FunctionBody<'a> {
2021-11-13 06:16:54 +00:00
pub locals: Vec<Type>,
2021-11-13 10:32:05 +00:00
pub blocks: Vec<Block<'a>>,
pub values: Vec<ValueDef>,
}
#[derive(Clone, Debug)]
pub struct ValueDef {
pub kind: ValueKind,
pub ty: Type,
}
#[derive(Clone, Debug)]
pub enum ValueKind {
2021-11-13 10:32:05 +00:00
BlockParam(BlockId, usize),
2021-11-13 09:41:32 +00:00
Inst(BlockId, InstId),
}
#[derive(Clone, Debug, Default)]
2021-11-13 10:32:05 +00:00
pub struct Block<'a> {
pub params: Vec<Type>,
2021-11-13 10:32:05 +00:00
pub insts: Vec<Inst<'a>>,
2021-11-13 11:38:47 +00:00
pub terminator: Terminator<'a>,
}
#[derive(Clone, Debug)]
2021-11-13 10:32:05 +00:00
pub struct Inst<'a> {
pub operator: Operator<'a>,
pub outputs: Vec<ValueId>,
2021-11-13 10:32:05 +00:00
pub inputs: Vec<Operand<'a>>,
}
#[derive(Clone, Debug)]
2021-11-13 10:32:05 +00:00
pub enum Operand<'a> {
Value(ValueId),
2021-11-13 10:32:05 +00:00
Sub(Box<Inst<'a>>),
2021-11-13 06:16:54 +00:00
}
2021-11-13 11:38:47 +00:00
2021-11-13 21:49:57 +00:00
#[derive(Clone, Debug)]
pub struct BlockTarget<'a> {
pub block: BlockId,
pub args: Vec<Operand<'a>>,
}
2021-11-13 11:38:47 +00:00
#[derive(Clone, Debug)]
pub enum Terminator<'a> {
Br {
2021-11-13 21:49:57 +00:00
target: BlockTarget<'a>,
2021-11-13 11:38:47 +00:00
},
CondBr {
cond: Operand<'a>,
2021-11-13 21:49:57 +00:00
if_true: BlockTarget<'a>,
if_false: BlockTarget<'a>,
2021-11-13 11:38:47 +00:00
},
Select {
value: Operand<'a>,
2021-11-13 21:49:57 +00:00
targets: Vec<BlockTarget<'a>>,
default: BlockTarget<'a>,
2021-11-13 11:38:47 +00:00
},
Return {
values: Vec<Operand<'a>>,
},
None,
}
impl<'a> std::default::Default for Terminator<'a> {
fn default() -> Self {
Terminator::None
}
}