diff --git a/examples/convert.rs b/examples/convert.rs index 195d475768..ccf0853931 100644 --- a/examples/convert.rs +++ b/examples/convert.rs @@ -9,10 +9,10 @@ fn main() { let args = env::args().collect::>(); let input = fs::read(&args[1]).unwrap(); - let module = javelin::parse_u8_slice(&input).unwrap(); + let module = javelin::front::spirv::parse_u8_slice(&input).unwrap(); //println!("{:?}", module); - let options = javelin::msl::Options {}; + let options = javelin::back::msl::Options {}; let msl = module.to_msl(&options).unwrap(); println!("{}", msl); } diff --git a/src/back/mod.rs b/src/back/mod.rs new file mode 100644 index 0000000000..f4f1fce17b --- /dev/null +++ b/src/back/mod.rs @@ -0,0 +1 @@ +pub mod msl; \ No newline at end of file diff --git a/src/msl.rs b/src/back/msl.rs similarity index 96% rename from src/msl.rs rename to src/back/msl.rs index 3da8c6ce55..959f1558ad 100644 --- a/src/msl.rs +++ b/src/back/msl.rs @@ -14,7 +14,7 @@ impl From for Error { } } -impl super::Module { +impl crate::Module { pub fn to_msl(&self, _options: &Options) -> Result { let mut out = String::new(); diff --git a/src/front/mod.rs b/src/front/mod.rs new file mode 100644 index 0000000000..e4919e7735 --- /dev/null +++ b/src/front/mod.rs @@ -0,0 +1 @@ +pub mod spirv; diff --git a/src/parse.rs b/src/front/spirv.rs similarity index 94% rename from src/parse.rs rename to src/front/spirv.rs index eb67b1cf54..cb95e2893a 100644 --- a/src/parse.rs +++ b/src/front/spirv.rs @@ -1,8 +1,6 @@ -use crate::storage::{Storage, Token}; - -use std::{ - collections::HashMap, - hash::BuildHasherDefault, +use crate::{ + storage::{Storage, Token}, + FastHashMap, }; const LAST_KNOWN_OPCODE: spirv::Op = spirv::Op::MemberDecorateStringGOOGLE; @@ -74,8 +72,6 @@ trait Lookup { fn lookup(&self, key: spirv::Word) -> Result<&Self::Target, ParseError>; } -type FastHashMap = HashMap>; - impl Lookup for FastHashMap { type Target = T; fn lookup(&self, key: spirv::Word) -> Result<&T, ParseError> { @@ -92,7 +88,7 @@ pub struct Parser { temp_bytes: Vec, future_names: FastHashMap, future_member_names: FastHashMap<(spirv::Word, MemberIndex), String>, - lookup_function: FastHashMap>, + lookup_function: FastHashMap>, } impl> Parser { @@ -101,9 +97,9 @@ impl> Parser { data, state: ModuleState::Empty, temp_bytes: Vec::new(), - future_names: HashMap::default(), - future_member_names: HashMap::default(), - lookup_function: HashMap::default(), + future_names: FastHashMap::default(), + future_member_names: FastHashMap::default(), + lookup_function: FastHashMap::default(), } } @@ -157,7 +153,7 @@ impl> Parser { } } - pub fn parse(&mut self) -> Result { + pub fn parse(&mut self) -> Result { let header = { if self.next()? != spirv::MAGIC_NUMBER { return Err(ParseError::InvalidHeader); @@ -166,7 +162,7 @@ impl> Parser { let generator = self.next()?; let _bound = self.next()?; let _schema = self.next()?; - super::Header { + crate::Header { version: (version_raw[2], version_raw[1], version_raw[0]), generator, } @@ -274,14 +270,14 @@ impl> Parser { let mut entry_points = Vec::with_capacity(raw_entry_points.len()); for (exec_model, name, fun_id) in raw_entry_points { - entry_points.push(super::EntryPoint { + entry_points.push(crate::EntryPoint { exec_model, name, function: *self.lookup_function.lookup(fun_id)?, }); } - Ok(super::Module { + Ok(crate::Module { header, struct_declarations: Storage::new(), functions: Storage::new(), @@ -290,7 +286,7 @@ impl> Parser { } } -pub fn parse_u8_slice(data: &[u8]) -> Result { +pub fn parse_u8_slice(data: &[u8]) -> Result { use std::convert::TryInto; if data.len() % 4 != 0 { diff --git a/src/lib.rs b/src/lib.rs index ec39a4bf6c..d6e6d674e4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,16 +1,18 @@ extern crate spirv_headers as spirv; -pub mod msl; -mod parse; +pub mod back; +pub mod front; mod storage; -pub use parse::{Parser, ParseError, parse_u8_slice}; use crate::storage::{Storage, Token}; -use std::collections::HashMap; +use std::{ + collections::HashMap, + hash::BuildHasherDefault, +}; -use smallvec::SmallVec; +type FastHashMap = HashMap>; @@ -37,47 +39,32 @@ pub enum Type { } #[derive(Debug)] -pub struct Jump { - pub target: Token, - pub arguments: SmallVec<[Token; 1]>, -} - -#[derive(Debug)] -pub enum Branch { - Jump(Jump), - JumpIf { - condition: Token, //bool - accept: Jump, - reject: Jump, - }, - Switch { - selector: Token, //int - cases: HashMap, - default: Jump, - }, - Return { - value: Option>, - }, -} - -#[derive(Debug)] -pub enum Operation { +pub enum Expression { Arithmetic, } +pub type Block = Vec; #[derive(Debug)] -pub enum Terminator { - Branch(Branch), - Kill, - Unreachable, -} +pub struct FallThrough; #[derive(Debug)] -pub struct Block { - pub label: Option, - pub argument_types: Vec, - pub operations: Storage, - pub terminator: Terminator, +pub enum Statement { + Expression(Expression), + Block(Block), + If { + condition: Expression, //bool + accept: Block, + reject: Block, + }, + Switch { + selector: Expression, //int + cases: FastHashMap)>, + default: Block, + }, + Return { + value: Option, + }, + Kill, } #[derive(Debug)] @@ -85,7 +72,7 @@ pub struct Function { pub name: Option, pub parameter_types: Vec, pub return_type: Type, - pub blocks: Storage, + pub body: Block, } #[derive(Debug)]