This commit is contained in:
nora 2022-04-16 23:56:29 +02:00
parent 9db60ac38d
commit bd2bde58b8
4 changed files with 64 additions and 57 deletions

View file

@ -26,9 +26,12 @@ pub struct Args {
pub profile: bool, pub profile: bool,
#[clap(long)] #[clap(long)]
pub dump: Option<DumpKind>, pub dump: Option<DumpKind>,
#[clap(long)]
pub mir: bool,
pub file: PathBuf, pub file: PathBuf,
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DumpKind { pub enum DumpKind {
Ast, Ast,
Hir, Hir,
@ -83,10 +86,12 @@ where
drop(parsed); drop(parsed);
drop(ast_alloc); drop(ast_alloc);
if let Some(DumpKind::Mir) = config.dump { if config.dump == Some(DumpKind::Mir) || config.mir {
let mir_alloc = Bump::new(); let mir_alloc = Bump::new();
let mir = mir::optimized_mir(&mir_alloc, &optimized_hir); let mir = mir::optimized_mir(&mir_alloc, &optimized_hir);
//println!("{mir:#?}"); if config.dump == Some(DumpKind::Mir) {
println!("{mir:#?}");
}
} }
let cg_alloc = Bump::new(); let cg_alloc = Bump::new();

View file

@ -27,14 +27,25 @@ fn pass_get_state_info_inner<'mir>(
) { ) {
for stmt in &mut mir.stmts { for stmt in &mut mir.stmts {
let state = match &mut stmt.kind { let state = match &mut stmt.kind {
StmtKind::AddSub(offset, _, store) => MemoryState::single( StmtKind::AddSub(offset, n, store) => {
let prev_state = outer.state_for_offset(*offset);
let new_state = match prev_state {
CellState::WrittenToKnown(_, prev_n) => {
let n = i16::from(prev_n).wrapping_add(*n);
let n = u8::try_from(n).unwrap();
CellState::WrittenToKnown(store.clone(), n)
}
_ => CellState::WrittenToUnknown(store.clone()),
};
MemoryState::single(
alloc, alloc,
outer, outer,
MemoryStateChange::Change { MemoryStateChange::Change {
offset: *offset, offset: *offset,
new_state: CellState::WrittenToUnknown(store.clone()), new_state,
}, },
), )
}
StmtKind::MoveAddTo { StmtKind::MoveAddTo {
offset, offset,
store_set_null, store_set_null,

View file

@ -1,5 +1,7 @@
// todo: we're gonna leak `Rc`s here aren't we?
use std::{ use std::{
cell::RefCell, cell::{Cell, RefCell},
fmt::{Debug, Formatter}, fmt::{Debug, Formatter},
rc::Rc, rc::Rc,
}; };
@ -32,10 +34,36 @@ pub struct MemoryState<'mir>(Rc<RefCell<MemoryStateInner<'mir>>>);
impl<'mir> MemoryState<'mir> { impl<'mir> MemoryState<'mir> {
pub fn empty(alloc: &'mir Bump) -> Self { pub fn empty(alloc: &'mir Bump) -> Self {
Self(Rc::new(RefCell::new(MemoryStateInner { Self::new(None, Vec::new_in(alloc))
prev: None, }
deltas: Vec::new_in(alloc),
}))) pub fn single(
alloc: &'mir Bump,
prev: MemoryState<'mir>,
delta: MemoryStateChange,
) -> MemoryState<'mir> {
let mut deltas = Vec::new_in(alloc);
deltas.push(delta);
Self::new(Some(prev), deltas)
}
pub fn double(
alloc: &'mir Bump,
prev: MemoryState<'mir>,
delta1: MemoryStateChange,
delta2: MemoryStateChange,
) -> MemoryState<'mir> {
let mut deltas = Vec::new_in(alloc);
deltas.push(delta1);
deltas.push(delta2);
Self::new(Some(prev), deltas)
}
pub fn new(
prev: Option<MemoryState<'mir>>,
deltas: BumpVec<'mir, MemoryStateChange>,
) -> MemoryState<'mir> {
Self(Rc::new(RefCell::new(MemoryStateInner { prev, deltas })))
} }
pub fn state_for_offset(&self, offset: i32) -> CellState { pub fn state_for_offset(&self, offset: i32) -> CellState {
@ -82,42 +110,8 @@ impl<'mir> MemoryStateInner<'mir> {
} }
} }
impl<'mir> MemoryState<'mir> {
pub fn single(
alloc: &'mir Bump,
prev: MemoryState<'mir>,
delta: MemoryStateChange,
) -> MemoryState<'mir> {
let mut deltas = Vec::new_in(alloc);
deltas.push(delta);
Self::new(prev, deltas)
}
pub fn double(
alloc: &'mir Bump,
prev: MemoryState<'mir>,
delta1: MemoryStateChange,
delta2: MemoryStateChange,
) -> MemoryState<'mir> {
let mut deltas = Vec::new_in(alloc);
deltas.push(delta1);
deltas.push(delta2);
Self::new(prev, deltas)
}
pub fn new(
prev: MemoryState<'mir>,
deltas: BumpVec<'mir, MemoryStateChange>,
) -> MemoryState<'mir> {
Self(Rc::new(RefCell::new(MemoryStateInner {
prev: Some(prev),
deltas,
})))
}
}
#[derive(Clone)] #[derive(Clone)]
pub struct Store(Rc<RefCell<StoreInner>>); pub struct Store(Rc<Cell<StoreInner>>);
impl Store { impl Store {
pub fn unknown() -> Self { pub fn unknown() -> Self {
@ -127,14 +121,11 @@ impl Store {
impl Debug for Store { impl Debug for Store {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
self.0 self.0.get().fmt(f)
.try_borrow()
.map(|s| StoreInner::fmt(&*s, f))
.unwrap_or_else(|_| f.debug_struct("Store").finish_non_exhaustive())
} }
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone, Copy)]
pub enum StoreInner { pub enum StoreInner {
Unknown, Unknown,
Used(usize), Used(usize),
@ -143,6 +134,6 @@ pub enum StoreInner {
impl From<StoreInner> for Store { impl From<StoreInner> for Store {
fn from(inner: StoreInner) -> Self { fn from(inner: StoreInner) -> Self {
Self(Rc::new(RefCell::new(inner))) Self(Rc::new(Cell::new(inner)))
} }
} }

View file

@ -1 +1 @@
[-]+>[-]<<>. [-]++<>->[-]<<>.