@@ -17,6 +17,10 @@ import lib.llvm.llvm.BasicBlockRef;
17
17
import lib. llvm . False ;
18
18
import lib. llvm . True ;
19
19
20
+ type trans_ctxt = rec ( session . session sess,
21
+ ModuleRef llmod,
22
+ str path ) ;
23
+
20
24
fn T_nil ( ) -> TypeRef {
21
25
ret llvm. LLVMVoidType ( ) ;
22
26
}
@@ -32,35 +36,54 @@ fn T_fn(vec[TypeRef] inputs, TypeRef output) -> TypeRef {
32
36
False ( ) ) ;
33
37
}
34
38
35
- fn trans_fn ( ModuleRef llmod, str name , & ast . _fn f) {
36
- let vec[ TypeRef ] args = vec ( ) ;
37
- let TypeRef llty = T_fn ( args, T_nil ( ) ) ;
38
- let ValueRef llfn =
39
- llvm. LLVMAddFunction ( llmod, _str. buf ( name) , llty) ;
39
+ fn trans_log ( & trans_ctxt cx, builder b, & ast. atom a ) {
40
40
}
41
41
42
- fn trans_block ( ast . block b, ValueRef llfn) {
42
+ fn trans_stmt ( & trans_ctxt cx, builder b, & ast . stmt s) {
43
+ alt ( s) {
44
+ case ( ast. stmt_log ( ?a) ) {
45
+ trans_log ( cx, b, * a) ;
46
+ }
47
+ case ( _) {
48
+ cx. sess . unimpl ( "stmt variant" ) ;
49
+ }
50
+ }
51
+ }
52
+
53
+ fn trans_block ( & trans_ctxt cx, ValueRef llfn, & ast . block b) {
43
54
let BasicBlockRef llbb =
44
- llvm. LLVMAppendBasicBlock ( llfn, 0 as sbuf ) ;
55
+ llvm. LLVMAppendBasicBlock ( llfn, _str . buf ( "" ) ) ;
45
56
let BuilderRef llbuild = llvm. LLVMCreateBuilder ( ) ;
46
57
llvm. LLVMPositionBuilderAtEnd ( llbuild, llbb) ;
47
- auto b = builder ( llbuild) ;
58
+ auto bld = builder ( llbuild) ;
59
+ for ( @ast. stmt s in b) {
60
+ trans_stmt ( cx, bld, * s) ;
61
+ }
62
+ }
63
+
64
+ fn trans_fn ( & trans_ctxt cx, & ast . _fn f) {
65
+ let vec[ TypeRef ] args = vec ( ) ;
66
+ let TypeRef llty = T_fn ( args, T_nil ( ) ) ;
67
+ let ValueRef llfn =
68
+ llvm. LLVMAddFunction ( cx. llmod , _str. buf ( cx. path ) , llty) ;
69
+ trans_block ( cx, llfn, f. body ) ;
48
70
}
49
71
50
- fn trans_mod_item ( ModuleRef llmod, str name , & ast . item item) {
72
+ fn trans_item ( & trans_ctxt cx, & str name , & ast . item item) {
73
+ auto sub_cx = rec ( path=cx. path + "." + name with cx) ;
51
74
alt ( item) {
52
75
case ( ast. item_fn ( ?f) ) {
53
- trans_fn ( llmod , name , * f) ;
76
+ trans_fn ( sub_cx , * f) ;
54
77
}
55
78
case ( ast. item_mod ( ?m) ) {
56
- trans_mod ( llmod , name , * m) ;
79
+ trans_mod ( sub_cx , * m) ;
57
80
}
58
81
}
59
82
}
60
83
61
- fn trans_mod ( ModuleRef llmod , str name , & ast. _mod m ) {
84
+ fn trans_mod ( & trans_ctxt cx , & ast. _mod m ) {
62
85
for each ( tup( str, ast. item) pair in m. items( ) ) {
63
- trans_mod_item ( llmod , name + "." + pair. _0 , pair. _1 ) ;
86
+ trans_item ( cx , pair. _0 , pair. _1 ) ;
64
87
}
65
88
}
66
89
@@ -69,6 +92,8 @@ fn trans_crate(session.session sess, ast.crate crate) {
69
92
llvm. LLVMModuleCreateWithNameInContext ( _str. buf ( "rust_out" ) ,
70
93
llvm. LLVMGetGlobalContext ( ) ) ;
71
94
95
+ auto cx = rec ( sess=sess, llmod=llmod, path="" ) ;
96
+ trans_mod ( cx, crate . module) ;
72
97
73
98
llvm. LLVMWriteBitcodeToFile ( llmod, _str. buf ( "rust_out.bc" ) ) ;
74
99
llvm. LLVMDisposeModule ( llmod) ;
0 commit comments