@@ -65,15 +65,9 @@ typedef struct {
6565 Node * nbb ;
6666} TodoBB ;
6767
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-
7468static TodoBB prepare_bb (Parser * p , Node * fn , LLVMBasicBlockRef bb ) {
7569 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 );
7771 if (get_log_level () <= DEBUG )
7872 LLVMDumpValue (bb );
7973
@@ -112,6 +106,18 @@ static TodoBB prepare_bb(Parser* p, Node* fn, LLVMBasicBlockRef bb) {
112106 }
113107}
114108
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+
115121const Node * convert_function (Parser * p , LLVMValueRef fn ) {
116122 if (is_llvm_intrinsic (fn )) {
117123 warn_print ("Skipping unknown LLVM intrinsic function: %s\n" , LLVMGetValueName (fn ));
@@ -154,39 +160,16 @@ const Node* convert_function(Parser* p, LLVMValueRef fn) {
154160 const Node * r = fn_addr_helper (a , f );
155161 insert_dict (LLVMValueRef , const Node * , p -> map , fn , r );
156162
157- /* if (LLVMCountBasicBlocks(fn) > 0) {
163+ if (LLVMCountBasicBlocks (fn ) > 0 ) {
158164 LLVMBasicBlockRef first_bb = LLVMGetEntryBasicBlock (fn );
159- BodyBuilder* b = begin_body(a);
160165 insert_dict (LLVMValueRef , const Node * , p -> map , first_bb , f );
166+ BodyBuilder * b = begin_body (a );
161167 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+ }
188169
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 );
190173 }
191174
192175 return r ;
@@ -265,6 +248,7 @@ bool parse_llvm_into_shady(const CompilerConfig* config, size_t len, const char*
265248 .annotations = new_dict (LLVMValueRef , ParsedAnnotation , (HashFn ) hash_opaque_ptr , (CmpFn ) cmp_opaque_ptr ),
266249 .scopes = new_dict (const Node * , Nodes , (HashFn ) hash_node , (CmpFn ) compare_node ),
267250 .phis = new_dict (const Node * , struct List * , (HashFn ) hash_node , (CmpFn ) compare_node ),
251+ .jumps_todo = new_list (JumpTodo ),
268252 .annotations_arena = new_arena (),
269253 .src = src ,
270254 .dst = dirty ,
@@ -307,6 +291,7 @@ bool parse_llvm_into_shady(const CompilerConfig* config, size_t len, const char*
307291 }
308292 }
309293 destroy_dict (p .phis );
294+ destroy_list (p .jumps_todo );
310295 destroy_arena (p .annotations_arena );
311296
312297 LLVMContextDispose (context );
0 commit comments