@@ -56,10 +56,23 @@ static const Node* write_bb_tail(Parser* p, Node* fn_or_bb, BodyBuilder* b, LLVM
56
56
assert (false);
57
57
}
58
58
59
+ typedef struct {
60
+ LLVMBasicBlockRef bb ;
61
+ LLVMValueRef instr ;
62
+ Node * nbb ;
63
+ } TodoBB ;
64
+
59
65
const Node * convert_basic_block (Parser * p , Node * fn , LLVMBasicBlockRef bb ) {
60
66
const Node * * found = find_value_dict (LLVMValueRef , const Node * , p -> map , bb );
61
67
if (found ) return * found ;
68
+ assert (false);
69
+ }
70
+
71
+ static TodoBB prepare_bb (Parser * p , Node * fn , LLVMBasicBlockRef bb ) {
62
72
IrArena * a = get_module_arena (p -> dst );
73
+ debug_print ("l2s: converting BB %s %d\n" , LLVMGetBasicBlockName (bb ), bb );
74
+ if (get_log_level () <= DEBUG )
75
+ LLVMDumpValue (bb );
63
76
64
77
struct List * phis = new_list (LLVMValueRef );
65
78
Nodes params = empty (a );
@@ -85,9 +98,14 @@ const Node* convert_basic_block(Parser* p, Node* fn, LLVMBasicBlockRef bb) {
85
98
Node * nbb = basic_block (a , fn , params , name );
86
99
insert_dict (LLVMValueRef , const Node * , p -> map , bb , nbb );
87
100
insert_dict (const Node * , struct List * , p -> phis , nbb , phis );
88
- BodyBuilder * b = begin_body (a );
89
- nbb -> payload .basic_block .body = write_bb_tail (p , nbb , b , bb , instr );
90
- return nbb ;
101
+ TodoBB todo = {
102
+ .bb = bb ,
103
+ .instr = instr ,
104
+ .nbb = nbb ,
105
+ };
106
+ //append_list(TodoBB, p->todo_bbs, todo);
107
+ //return nbb;
108
+ return todo ;
91
109
}
92
110
}
93
111
@@ -107,12 +125,14 @@ const Node* convert_function(Parser* p, LLVMValueRef fn) {
107
125
debug_print ("Converting function: %s\n" , LLVMGetValueName (fn ));
108
126
109
127
Nodes params = empty (a );
110
- for (LLVMValueRef oparam = LLVMGetFirstParam (fn ); oparam && oparam <= LLVMGetLastParam ( fn ) ; oparam = LLVMGetNextParam (oparam )) {
128
+ for (LLVMValueRef oparam = LLVMGetFirstParam (fn ); oparam ; oparam = LLVMGetNextParam (oparam )) {
111
129
LLVMTypeRef ot = LLVMTypeOf (oparam );
112
130
const Type * t = convert_type (p , ot );
113
131
const Node * param = var (a , t , LLVMGetValueName (oparam ));
114
132
insert_dict (LLVMValueRef , const Node * , p -> map , oparam , param );
115
133
params = append_nodes (a , params , param );
134
+ if (oparam == LLVMGetLastParam (fn ))
135
+ break ;
116
136
}
117
137
const Type * fn_type = convert_type (p , LLVMGlobalGetValueType (fn ));
118
138
assert (fn_type -> tag == FnType_TAG );
@@ -131,11 +151,39 @@ const Node* convert_function(Parser* p, LLVMValueRef fn) {
131
151
const Node * r = fn_addr_helper (a , f );
132
152
insert_dict (LLVMValueRef , const Node * , p -> map , fn , r );
133
153
134
- if (LLVMCountBasicBlocks (fn ) > 0 ) {
154
+ /* if (LLVMCountBasicBlocks(fn) > 0) {
135
155
LLVMBasicBlockRef first_bb = LLVMGetEntryBasicBlock(fn);
136
156
BodyBuilder* b = begin_body(a);
137
157
insert_dict(LLVMValueRef, const Node*, p->map, first_bb, f);
138
158
f->payload.fun.body = write_bb_tail(p, f, b, first_bb, LLVMGetFirstInstruction(first_bb));
159
+ }*/
160
+
161
+ if (LLVMCountBasicBlocks (fn ) > 0 ) {
162
+ struct List * todo_bbs = new_list (TodoBB );
163
+
164
+ for (LLVMBasicBlockRef bb = LLVMGetEntryBasicBlock (fn ); bb ; bb = LLVMGetNextBasicBlock (bb )) {
165
+ if (bb == LLVMGetEntryBasicBlock (fn )) {
166
+ LLVMBasicBlockRef first_bb = LLVMGetEntryBasicBlock (fn );
167
+ insert_dict (LLVMValueRef , const Node * , p -> map , first_bb , f );
168
+ } else {
169
+ TodoBB todo = prepare_bb (p , f , bb );
170
+ append_list (TodoBB , todo_bbs , todo );
171
+ }
172
+ if (bb == LLVMGetLastBasicBlock (fn ))
173
+ break ;
174
+ }
175
+
176
+ LLVMBasicBlockRef first_bb = LLVMGetEntryBasicBlock (fn );
177
+ BodyBuilder * entry_bb = begin_body (a );
178
+ f -> payload .fun .body = write_bb_tail (p , f , entry_bb , first_bb , LLVMGetFirstInstruction (first_bb ));
179
+
180
+ for (size_t i = 0 ; i < entries_count_list (todo_bbs ); i ++ ) {
181
+ TodoBB todo = read_list (TodoBB , todo_bbs )[i ];
182
+ BodyBuilder * bb = begin_body (a );
183
+ todo .nbb -> payload .basic_block .body = write_bb_tail (p , todo .nbb , bb , todo .bb , todo .instr );
184
+ }
185
+
186
+ destroy_list (todo_bbs );
139
187
}
140
188
141
189
return r ;
0 commit comments