@@ -65,15 +65,9 @@ typedef struct {
65
65
Node * nbb ;
66
66
} TodoBB ;
67
67
68
- const Node * convert_basic_block (Parser * p , Node * fn , LLVMBasicBlockRef bb ) {
69
- const Node * * found = find_value_dict (LLVMValueRef , const Node * , p -> map , bb );
70
- if (found ) return * found ;
71
- assert (false);
72
- }
73
-
74
68
static TodoBB prepare_bb (Parser * p , Node * fn , LLVMBasicBlockRef bb ) {
75
69
IrArena * a = get_module_arena (p -> dst );
76
- debug_print ("l2s: converting BB %s %d\n" , LLVMGetBasicBlockName (bb ), bb );
70
+ debug_print ("l2s: preparing BB %s %d\n" , LLVMGetBasicBlockName (bb ), bb );
77
71
if (get_log_level () <= DEBUG )
78
72
LLVMDumpValue (bb );
79
73
@@ -112,6 +106,18 @@ static TodoBB prepare_bb(Parser* p, Node* fn, LLVMBasicBlockRef bb) {
112
106
}
113
107
}
114
108
109
+ const Node * convert_basic_block (Parser * p , Node * fn , LLVMBasicBlockRef bb ) {
110
+ IrArena * a = get_module_arena (p -> dst );
111
+ const Node * * found = find_value_dict (LLVMValueRef , const Node * , p -> map , bb );
112
+ if (found ) return * found ;
113
+ // assert(false);
114
+
115
+ TodoBB todo = prepare_bb (p , fn , bb );
116
+ BodyBuilder * bb_bb = begin_body (a );
117
+ todo .nbb -> payload .basic_block .body = write_bb_tail (p , todo .nbb , bb_bb , todo .bb , todo .instr );
118
+ return todo .nbb ;
119
+ }
120
+
115
121
const Node * convert_function (Parser * p , LLVMValueRef fn ) {
116
122
if (is_llvm_intrinsic (fn )) {
117
123
warn_print ("Skipping unknown LLVM intrinsic function: %s\n" , LLVMGetValueName (fn ));
@@ -154,39 +160,16 @@ const Node* convert_function(Parser* p, LLVMValueRef fn) {
154
160
const Node * r = fn_addr_helper (a , f );
155
161
insert_dict (LLVMValueRef , const Node * , p -> map , fn , r );
156
162
157
- /* if (LLVMCountBasicBlocks(fn) > 0) {
163
+ if (LLVMCountBasicBlocks (fn ) > 0 ) {
158
164
LLVMBasicBlockRef first_bb = LLVMGetEntryBasicBlock (fn );
159
- BodyBuilder* b = begin_body(a);
160
165
insert_dict (LLVMValueRef , const Node * , p -> map , first_bb , f );
166
+ BodyBuilder * b = begin_body (a );
161
167
f -> payload .fun .body = write_bb_tail (p , f , b , first_bb , LLVMGetFirstInstruction (first_bb ));
162
- }*/
163
-
164
- if (LLVMCountBasicBlocks (fn ) > 0 ) {
165
- struct List * todo_bbs = new_list (TodoBB );
166
-
167
- for (LLVMBasicBlockRef bb = LLVMGetEntryBasicBlock (fn ); bb ; bb = LLVMGetNextBasicBlock (bb )) {
168
- if (bb == LLVMGetEntryBasicBlock (fn )) {
169
- LLVMBasicBlockRef first_bb = LLVMGetEntryBasicBlock (fn );
170
- insert_dict (LLVMValueRef , const Node * , p -> map , first_bb , f );
171
- } else {
172
- TodoBB todo = prepare_bb (p , f , bb );
173
- append_list (TodoBB , todo_bbs , todo );
174
- }
175
- if (bb == LLVMGetLastBasicBlock (fn ))
176
- break ;
177
- }
178
-
179
- LLVMBasicBlockRef first_bb = LLVMGetEntryBasicBlock (fn );
180
- BodyBuilder * entry_bb = begin_body (a );
181
- f -> payload .fun .body = write_bb_tail (p , f , entry_bb , first_bb , LLVMGetFirstInstruction (first_bb ));
182
-
183
- for (size_t i = 0 ; i < entries_count_list (todo_bbs ); i ++ ) {
184
- TodoBB todo = read_list (TodoBB , todo_bbs )[i ];
185
- BodyBuilder * bb = begin_body (a );
186
- todo .nbb -> payload .basic_block .body = write_bb_tail (p , todo .nbb , bb , todo .bb , todo .instr );
187
- }
168
+ }
188
169
189
- destroy_list (todo_bbs );
170
+ while (entries_count_list (p -> jumps_todo ) > 0 ) {
171
+ JumpTodo todo = pop_last_list (JumpTodo , p -> jumps_todo );
172
+ convert_jump_finish (p , f , todo );
190
173
}
191
174
192
175
return r ;
@@ -265,6 +248,7 @@ bool parse_llvm_into_shady(const CompilerConfig* config, size_t len, const char*
265
248
.annotations = new_dict (LLVMValueRef , ParsedAnnotation , (HashFn ) hash_opaque_ptr , (CmpFn ) cmp_opaque_ptr ),
266
249
.scopes = new_dict (const Node * , Nodes , (HashFn ) hash_node , (CmpFn ) compare_node ),
267
250
.phis = new_dict (const Node * , struct List * , (HashFn ) hash_node , (CmpFn ) compare_node ),
251
+ .jumps_todo = new_list (JumpTodo ),
268
252
.annotations_arena = new_arena (),
269
253
.src = src ,
270
254
.dst = dirty ,
@@ -307,6 +291,7 @@ bool parse_llvm_into_shady(const CompilerConfig* config, size_t len, const char*
307
291
}
308
292
}
309
293
destroy_dict (p .phis );
294
+ destroy_list (p .jumps_todo );
310
295
destroy_arena (p .annotations_arena );
311
296
312
297
LLVMContextDispose (context );
0 commit comments