@@ -3,7 +3,11 @@ mod env;
33
44use 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+ } ;
711use ast as out_a;
812
913pub 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-
4039fn 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 }
0 commit comments