This commit is contained in:
Chris Fallin 2021-11-21 02:27:11 -08:00
parent 4cdd726275
commit 58ef5a86f7
5 changed files with 252 additions and 2 deletions

28
src/backend/location.rs Normal file
View file

@ -0,0 +1,28 @@
//! Decide locations for each Value.
use crate::cfg::CFGInfo;
use crate::ir::*;
use wasmparser::Type;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Location {
// Store in a local.
Local(usize),
// Immediately generate at a single use-site.
Stack,
// No location.
None,
}
#[derive(Clone, Debug)]
pub struct Locations {
next_local: usize,
extra_locals: Vec<Type>,
locations: Vec</* Value, */ Location>,
}
impl Locations {
fn compute(_f: &FunctionBody, _cfg: &CFGInfo) -> Self {
todo!()
}
}

View file

@ -3,3 +3,5 @@
mod stackify; mod stackify;
pub(crate) use stackify::*; pub(crate) use stackify::*;
mod location;
pub(crate) use location::*;

View file

@ -51,7 +51,7 @@ pub struct ValueDef {
pub ty: Type, pub ty: Type,
} }
#[derive(Clone, Debug)] #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum ValueKind { pub enum ValueKind {
Arg(usize), Arg(usize),
BlockParam(BlockId, usize), BlockParam(BlockId, usize),

View file

@ -8,10 +8,11 @@ pub use wasm_encoder;
pub use wasmparser; pub use wasmparser;
mod backend; mod backend;
mod cfg;
mod dataflow; mod dataflow;
mod frontend; mod frontend;
mod ir; mod ir;
mod op_traits; mod op_traits;
mod cfg; mod pass;
pub use ir::*; pub use ir::*;

View file

@ -436,3 +436,222 @@ pub fn op_outputs(
_ => bail!("Unknown operator in op_outputs(): {:?}", op), _ => bail!("Unknown operator in op_outputs(): {:?}", op),
} }
} }
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SideEffect {
Trap,
ReadMem,
WriteMem,
ReadGlobal(usize),
WriteGlobal(usize),
ReadTable(usize),
WriteTable(usize),
ReadLocal(usize),
WriteLocal(usize),
Return,
All,
}
pub fn op_effects(op: &Operator<'_>) -> Result<Vec<SideEffect>> {
use SideEffect::*;
match op {
&Operator::Unreachable => Ok(vec![Trap]),
&Operator::Nop => Ok(vec![]),
&Operator::Call { .. } => Ok(vec![All]),
&Operator::CallIndirect { .. } => Ok(vec![All]),
&Operator::Return => Ok(vec![Return]),
&Operator::LocalSet { local_index, .. } => Ok(vec![WriteLocal(local_index as usize)]),
&Operator::LocalGet { local_index, .. } => Ok(vec![ReadLocal(local_index as usize)]),
&Operator::LocalTee { local_index, .. } => Ok(vec![
ReadLocal(local_index as usize),
WriteLocal(local_index as usize),
]),
&Operator::Select => Ok(vec![]),
&Operator::TypedSelect { .. } => Ok(vec![]),
&Operator::GlobalGet { global_index, .. } => Ok(vec![ReadGlobal(global_index as usize)]),
&Operator::GlobalSet { global_index, .. } => Ok(vec![WriteGlobal(global_index as usize)]),
Operator::I32Load { .. }
| Operator::I32Load8S { .. }
| Operator::I32Load8U { .. }
| Operator::I32Load16S { .. }
| Operator::I32Load16U { .. }
| Operator::I64Load { .. }
| Operator::I64Load8S { .. }
| Operator::I64Load8U { .. }
| Operator::I64Load16S { .. }
| Operator::I64Load16U { .. }
| Operator::I64Load32S { .. }
| Operator::I64Load32U { .. }
| Operator::F32Load { .. }
| Operator::F64Load { .. } => Ok(vec![Trap, ReadMem]),
Operator::I32Store { .. }
| Operator::I64Store { .. }
| Operator::F32Store { .. }
| Operator::F64Store { .. }
| Operator::I32Store8 { .. }
| Operator::I32Store16 { .. }
| Operator::I64Store8 { .. }
| Operator::I64Store16 { .. }
| Operator::I64Store32 { .. } => Ok(vec![Trap, WriteMem]),
Operator::I32Const { .. }
| Operator::I64Const { .. }
| Operator::F32Const { .. }
| Operator::F64Const { .. } => Ok(vec![]),
Operator::I32Eqz
| Operator::I32Eq
| Operator::I32Ne
| Operator::I32LtS
| Operator::I32LtU
| Operator::I32GtS
| Operator::I32GtU
| Operator::I32LeS
| Operator::I32LeU
| Operator::I32GeS
| Operator::I32GeU
| Operator::I64Eqz
| Operator::I64Eq
| Operator::I64Ne
| Operator::I64LtS
| Operator::I64LtU
| Operator::I64GtU
| Operator::I64GtS
| Operator::I64LeS
| Operator::I64LeU
| Operator::I64GeS
| Operator::I64GeU
| Operator::F32Eq
| Operator::F32Ne
| Operator::F32Lt
| Operator::F32Gt
| Operator::F32Le
| Operator::F32Ge
| Operator::F64Eq
| Operator::F64Ne
| Operator::F64Lt
| Operator::F64Gt
| Operator::F64Le
| Operator::F64Ge => Ok(vec![]),
Operator::I32Clz
| Operator::I32Ctz
| Operator::I32Popcnt
| Operator::I32Add
| Operator::I32Sub
| Operator::I32Mul
| Operator::I32And
| Operator::I32Or
| Operator::I32Xor
| Operator::I32Shl
| Operator::I32ShrS
| Operator::I32ShrU
| Operator::I32Rotl
| Operator::I32Rotr => Ok(vec![]),
Operator::I32DivS | Operator::I32DivU | Operator::I32RemS | Operator::I32RemU => {
Ok(vec![Trap])
}
Operator::I64Clz
| Operator::I64Ctz
| Operator::I64Popcnt
| Operator::I64Add
| Operator::I64Sub
| Operator::I64Mul
| Operator::I64And
| Operator::I64Or
| Operator::I64Xor
| Operator::I64Shl
| Operator::I64ShrS
| Operator::I64ShrU
| Operator::I64Rotl
| Operator::I64Rotr => Ok(vec![]),
Operator::I64DivS | Operator::I64DivU | Operator::I64RemS | Operator::I64RemU => {
Ok(vec![Trap])
}
Operator::F32Abs
| Operator::F32Neg
| Operator::F32Ceil
| Operator::F32Floor
| Operator::F32Trunc
| Operator::F32Nearest
| Operator::F32Sqrt
| Operator::F32Add
| Operator::F32Sub
| Operator::F32Mul
| Operator::F32Div
| Operator::F32Min
| Operator::F32Max
| Operator::F32Copysign => Ok(vec![]),
Operator::F64Abs
| Operator::F64Neg
| Operator::F64Ceil
| Operator::F64Floor
| Operator::F64Trunc
| Operator::F64Nearest
| Operator::F64Sqrt
| Operator::F64Add
| Operator::F64Sub
| Operator::F64Mul
| Operator::F64Div
| Operator::F64Min
| Operator::F64Max
| Operator::F64Copysign => Ok(vec![]),
Operator::I32WrapI64 => Ok(vec![]),
Operator::I32TruncF32S => Ok(vec![Trap]),
Operator::I32TruncF32U => Ok(vec![Trap]),
Operator::I32TruncF64S => Ok(vec![Trap]),
Operator::I32TruncF64U => Ok(vec![Trap]),
Operator::I64ExtendI32S => Ok(vec![]),
Operator::I64ExtendI32U => Ok(vec![]),
Operator::I64TruncF32S => Ok(vec![Trap]),
Operator::I64TruncF32U => Ok(vec![Trap]),
Operator::I64TruncF64S => Ok(vec![Trap]),
Operator::I64TruncF64U => Ok(vec![Trap]),
Operator::F32ConvertI32S => Ok(vec![]),
Operator::F32ConvertI32U => Ok(vec![]),
Operator::F32ConvertI64S => Ok(vec![]),
Operator::F32ConvertI64U => Ok(vec![]),
Operator::F32DemoteF64 => Ok(vec![]),
Operator::F64ConvertI32S => Ok(vec![]),
Operator::F64ConvertI32U => Ok(vec![]),
Operator::F64ConvertI64S => Ok(vec![]),
Operator::F64ConvertI64U => Ok(vec![]),
Operator::F64PromoteF32 => Ok(vec![]),
Operator::I32Extend8S => Ok(vec![]),
Operator::I32Extend16S => Ok(vec![]),
Operator::I64Extend8S => Ok(vec![]),
Operator::I64Extend16S => Ok(vec![]),
Operator::I64Extend32S => Ok(vec![]),
Operator::I32TruncSatF32S => Ok(vec![]),
Operator::I32TruncSatF32U => Ok(vec![]),
Operator::I32TruncSatF64S => Ok(vec![]),
Operator::I32TruncSatF64U => Ok(vec![]),
Operator::I64TruncSatF32S => Ok(vec![]),
Operator::I64TruncSatF32U => Ok(vec![]),
Operator::I64TruncSatF64S => Ok(vec![]),
Operator::I64TruncSatF64U => Ok(vec![]),
Operator::F32ReinterpretI32 => Ok(vec![]),
Operator::F64ReinterpretI64 => Ok(vec![]),
Operator::I32ReinterpretF32 => Ok(vec![]),
Operator::I64ReinterpretF64 => Ok(vec![]),
Operator::TableGet { table, .. } => Ok(vec![ReadTable(*table as usize), Trap]),
Operator::TableSet { table, .. } => Ok(vec![WriteTable(*table as usize), Trap]),
Operator::TableGrow { table, .. } => Ok(vec![WriteTable(*table as usize), Trap]),
Operator::TableSize { table, .. } => Ok(vec![ReadTable(*table as usize)]),
Operator::MemorySize { .. } => Ok(vec![ReadMem]),
Operator::MemoryGrow { .. } => Ok(vec![WriteMem, Trap]),
_ => bail!("Unknown operator in op_outputs(): {:?}", op),
}
}