Skip to content

Commit 1c027b3

Browse files
dominik-mucCopilot
andauthored
Refactor layout calculation (#13)
* Refactor layout calculation Also removed requirement of statically known sizes of types, now only each instance needs to have a stable layout. This will also fix bugs with non-deterministic field order in structs. * Remove redundant functions in comments Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Add align calculation Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/symtable/mod.rs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix typo --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 6de6e8f commit 1c027b3

File tree

12 files changed

+234
-520
lines changed

12 files changed

+234
-520
lines changed

src/core/ast.rs

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,7 @@ use std::collections::HashMap;
22

33
use cranelift_codegen::ir::Signature;
44

5-
use crate::common::NodeID;
6-
7-
#[derive(Debug, Clone)]
8-
pub enum Type {
9-
Tu8,
10-
Tu16,
11-
Tu32,
12-
Tu64,
13-
Tusize,
14-
Ti8,
15-
Ti16,
16-
Ti32,
17-
Ti64,
18-
Tisize,
19-
}
5+
use crate::{common::NodeID, symtable::layout::Type};
206

217
#[derive(Debug, Clone)]
228
pub struct FnSig {

src/core/mod.rs

Lines changed: 41 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ mod env;
33

44
use std::mem::transmute;
55

6-
use crate::{core::env::Env, mir::ast as in_a};
6+
use crate::{
7+
core::env::Env,
8+
mir::ast as in_a,
9+
symtable::layout::{Layout, LayoutKind},
10+
};
711
use ast as out_a;
812

913
pub fn translate(prog: in_a::Program) -> out_a::Program {
@@ -18,10 +22,9 @@ fn tr_func(f: in_a::Func) -> out_a::Func {
1822
let mut env = Env::new();
1923
for (id, _, tp) in f.args {
2024
let id = env.add_var(id);
21-
let tp = tr_type(tp);
2225
args.push((id, tp));
2326
}
24-
let returns = f.returns.into_iter().map(|tp| tr_type(tp)).collect();
27+
let returns = f.returns;
2528

2629
let body = tr_expr(&mut env, f.body);
2730

@@ -33,13 +36,9 @@ fn tr_func(f: in_a::Func) -> out_a::Func {
3336
}
3437
}
3538

36-
fn tr_type(tp: in_a::Type) -> out_a::Type {
37-
unsafe { transmute(tp) }
38-
}
39-
4039
fn tr_expr(env: &mut Env, e: in_a::Expr) -> out_a::Expr {
4140
match e {
42-
in_a::Expr::NumLit(n, tp) => out_a::Expr::Value(ast::Value::Const(n, tr_type(tp))),
41+
in_a::Expr::NumLit(n, tp) => out_a::Expr::Value(ast::Value::Const(n, tp)),
4342
in_a::Expr::StringLit(_, layout) => todo!(),
4443
in_a::Expr::Tuple { fields, layout } => {
4544
let ss = out_a::Expr::StackSlot {
@@ -53,12 +52,18 @@ fn tr_expr(env: &mut Env, e: in_a::Expr) -> out_a::Expr {
5352
id,
5453
e1: Box::new(ss),
5554
}];
56-
for (field, layout) in fields {
55+
let layouts = match layout.kind {
56+
LayoutKind::Primitive(_) => todo!(),
57+
LayoutKind::Struct(items) => items,
58+
LayoutKind::Union(layouts) => todo!(),
59+
};
60+
for (id, field) in fields.into_iter().enumerate() {
5761
let field = tr_expr(env, field);
62+
let (layout, offset) = layouts[id].clone();
5863
let st = out_a::Expr::Store {
5964
ptr: Box::new(ast::Expr::Value(s_v.clone())),
6065
val: Box::new(field),
61-
offset: layout.offset as i32,
66+
offset,
6267
};
6368
exprs.push(st);
6469
}
@@ -75,8 +80,8 @@ fn tr_expr(env: &mut Env, e: in_a::Expr) -> out_a::Expr {
7580
} => {
7681
let expr = tr_expr(env, *expr);
7782

78-
match &ret_tp.layout {
79-
in_a::TypeLayout::Simple { tp } => {
83+
match &ret_tp.kind {
84+
LayoutKind::Primitive(tp) => {
8085
let args = args.into_iter().map(|a| tr_expr(env, a)).collect();
8186
let sig = make_sig(args_tp, ret_tp);
8287
out_a::Expr::FunCall {
@@ -85,34 +90,33 @@ fn tr_expr(env: &mut Env, e: in_a::Expr) -> out_a::Expr {
8590
sig,
8691
}
8792
}
88-
in_a::TypeLayout::Array { elem_layout, elems } => todo!(),
89-
in_a::TypeLayout::Tuple {
90-
field_count,
91-
fields,
92-
} => {
93+
LayoutKind::Struct(_) => {
9394
todo!("sret is not implemented yet")
9495
}
96+
LayoutKind::Union(layouts) => todo!(),
9597
}
9698
}
9799
in_a::Expr::FieldAccess {
98100
object,
99101
field_id,
100102
struct_layout,
101103
element_layout,
102-
} => match element_layout.layout {
103-
in_a::TypeLayout::Simple { tp } => {
104+
} => match struct_layout.kind {
105+
LayoutKind::Primitive(tp) => todo!(),
106+
LayoutKind::Struct(items) => {
107+
let (layout, offset) = items[field_id].clone();
104108
let ptr = Box::new(tr_expr(env, *object));
105-
out_a::Expr::Load {
106-
tp: tr_type(tp),
107-
ptr,
108-
offset: element_layout.offset as i32,
109+
match layout.kind {
110+
LayoutKind::Primitive(tp) => out_a::Expr::Load {
111+
tp,
112+
ptr,
113+
offset: offset,
114+
},
115+
LayoutKind::Struct(items) => todo!(),
116+
LayoutKind::Union(layouts) => todo!(),
109117
}
110118
}
111-
in_a::TypeLayout::Array { elem_layout, elems } => todo!(),
112-
in_a::TypeLayout::Tuple {
113-
field_count,
114-
fields,
115-
} => todo!(),
119+
LayoutKind::Union(layouts) => todo!(),
116120
},
117121
in_a::Expr::Block {
118122
exprs,
@@ -180,25 +184,19 @@ fn tr_expr(env: &mut Env, e: in_a::Expr) -> out_a::Expr {
180184
}
181185
}
182186

183-
fn make_sig(args_tp: Vec<in_a::Layout>, ret_tp: in_a::Layout) -> ast::FnSig {
187+
fn make_sig(args_tp: Vec<Layout>, ret_tp: Layout) -> ast::FnSig {
184188
let mut params = vec![];
185189
let mut returns = vec![];
186-
match ret_tp.layout {
187-
in_a::TypeLayout::Simple { tp } => returns.push(tr_type(tp)),
188-
in_a::TypeLayout::Array { elem_layout, elems } => todo!(),
189-
in_a::TypeLayout::Tuple {
190-
field_count,
191-
fields,
192-
} => params.push(ast::Type::Tusize),
190+
match ret_tp.kind {
191+
LayoutKind::Primitive(tp) => returns.push(tp),
192+
LayoutKind::Struct(items) => todo!(),
193+
LayoutKind::Union(layouts) => todo!(),
193194
}
194195
for arg in args_tp {
195-
match arg.layout {
196-
in_a::TypeLayout::Simple { tp } => params.push(tr_type(tp)),
197-
in_a::TypeLayout::Array { elem_layout, elems } => todo!(),
198-
in_a::TypeLayout::Tuple {
199-
field_count,
200-
fields,
201-
} => todo!(),
196+
match arg.kind {
197+
LayoutKind::Primitive(tp) => params.push(tp),
198+
LayoutKind::Struct(items) => todo!(),
199+
LayoutKind::Union(layouts) => todo!(),
202200
}
203201
}
204202
ast::FnSig { params, returns }

src/mir/ast.rs

Lines changed: 5 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,9 @@
11
use std::collections::HashMap;
22

3-
use crate::common::NodeID;
4-
5-
#[derive(Debug, Clone)]
6-
pub enum Type {
7-
Tu8,
8-
Tu16,
9-
Tu32,
10-
Tu64,
11-
Tusize,
12-
Ti8,
13-
Ti16,
14-
Ti32,
15-
Ti64,
16-
Tisize,
17-
}
18-
19-
#[derive(Debug, Clone)]
20-
pub enum TypeLayout {
21-
Simple {
22-
tp: Type,
23-
},
24-
Array {
25-
elem_layout: Box<Layout>,
26-
elems: usize,
27-
},
28-
Tuple {
29-
field_count: usize,
30-
fields: Vec<Layout>,
31-
},
32-
}
33-
34-
#[derive(Debug, Clone)]
35-
pub struct Layout {
36-
pub layout: TypeLayout,
37-
pub size: usize,
38-
pub offset: usize,
39-
pub align: usize,
40-
}
41-
impl Layout {
42-
pub(crate) fn require_stack(&self) -> bool {
43-
match &self.layout {
44-
TypeLayout::Simple { tp } => false,
45-
TypeLayout::Array { elem_layout, elems } => true,
46-
TypeLayout::Tuple {
47-
field_count,
48-
fields,
49-
} => true,
50-
}
51-
}
52-
}
3+
use crate::{
4+
common::NodeID,
5+
symtable::layout::{Layout, Type},
6+
};
537

548
#[derive(Debug)]
559
pub struct Program {
@@ -112,7 +66,7 @@ pub enum Expr {
11266
NumLit(usize, Type),
11367
StringLit(String, Layout),
11468
Tuple {
115-
fields: Vec<(Expr, Layout)>,
69+
fields: Vec<Expr>,
11670
layout: Layout,
11771
},
11872
FunCall {

0 commit comments

Comments
 (0)