@@ -44,23 +44,29 @@ impl Fir {
44
44
types : & Vec < TypeTree > ,
45
45
oir : & mut Oir ,
46
46
) -> Function {
47
- let sig = Signature :: new ( CallConv :: Cold ) ;
47
+ let sig = Signature :: new ( CallConv :: Fast ) ;
48
48
let name = UserFuncName :: user ( namespace, index) ;
49
49
// todo:: types need to be worked out, params and returns defined
50
50
let mut func = Function :: with_name_signature ( name, sig) ;
51
51
let mut builder = FunctionBuilder :: new ( & mut func, ctx) ;
52
52
let root_block = builder. create_block ( ) ;
53
- // todo:: this is the issue with function arguments not working simple repr add case
54
- func_def. args . iter ( ) . for_each ( |x| {
53
+ let mut result_sets = vec ! [ ] ;
54
+ for x in func_def. args . iter ( ) {
55
55
let z = self
56
56
. recurse ( * x, & mut builder, dtbl, scopes, types, oir)
57
57
. unwrap ( ) ;
58
58
builder. func . signature . params . push ( AbiParam :: new ( I64 ) ) ;
59
- //let res = builder.block_params(root_block)[z.as_u32() as usize];
60
- } ) ;
61
- builder. func . signature . returns . push ( AbiParam :: new ( I64 ) ) ;
59
+ result_sets. push ( z) ;
60
+ }
62
61
builder. append_block_params_for_function_params ( root_block) ;
63
62
builder. switch_to_block ( root_block) ;
63
+
64
+ for ( i, x) in result_sets. iter ( ) . enumerate ( ) {
65
+ let res = builder. block_params ( root_block) [ i] ;
66
+ builder. def_var ( * x, res) ;
67
+ }
68
+ builder. func . signature . returns . push ( AbiParam :: new ( I64 ) ) ;
69
+
64
70
let _result = self . recurse ( func_def. block , & mut builder, dtbl, scopes, types, oir) ;
65
71
builder. seal_block ( root_block) ;
66
72
builder. finalize ( ) ;
@@ -76,6 +82,7 @@ impl Fir {
76
82
oir : & mut Oir ,
77
83
) -> ResultFir < Variable > {
78
84
let result = self . add_var ( ) ;
85
+ builder. declare_var ( result, I64 ) ;
79
86
self . sym . table . insert ( op. ident . clone ( ) , result. as_u32 ( ) ) ;
80
87
Ok ( result)
81
88
}
0 commit comments