authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-21 17:10:16-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-21 17:10:16-04:00
log6053ca4f69e490c744384bd02e89df595ff7b085
tree09da255ce1ab10fe0233cb5293b7916a2cc1d814
parent27a5f2c4fa9cfa104faa4cc2b15cd21cc5a5501f
signature Commit is signed but in an unrecognized format.

fix not jumping to entry


2 files changed, 13 insertions(+), 6 deletions(-)

src/codegen.cpp+9-4
......@@ -6413,6 +6413,7 @@ static void do_code_gen(CodeGen *g) {
64136413 ZigLLVMSetCurrentDebugLocation(g->builder, (int)source_node->line + 1,
64146414 (int)source_node->column + 1, get_di_scope(g, fn_table_entry->child_scope));
64156415 }
6416 IrExecutable *executable = &fn_table_entry->analyzed_executable;
64166417 LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type;
64176418 LLVMBasicBlockRef bad_resume_block = LLVMAppendBasicBlock(g->cur_fn_val, "BadResume");
64186419 LLVMPositionBuilderAtEnd(g->builder, bad_resume_block);
......@@ -6429,15 +6430,19 @@ static void do_code_gen(CodeGen *g) {
64296430 LLVMValueRef resume_index_ptr = LLVMBuildStructGEP(g->builder, g->cur_ret_ptr,
64306431 coro_resume_index_index, "");
64316432 LLVMValueRef resume_index = LLVMBuildLoad(g->builder, resume_index_ptr, "");
6432 // The +1 is because index 0 is reserved for getting the size.
6433 // +1 - index 0 is reserved for the entry block
6434 // +1 - index 1 is reserved for getting the size.
64336435 LLVMValueRef switch_instr = LLVMBuildSwitch(g->builder, resume_index, bad_resume_block,
6434 fn_table_entry->resume_blocks.length + 1);
6436 fn_table_entry->resume_blocks.length + 2);
64356437
64366438 LLVMValueRef zero = LLVMConstNull(usize_type_ref);
6437 LLVMAddCase(switch_instr, zero, get_size_block);
6439 LLVMAddCase(switch_instr, zero, executable->basic_block_list.at(0)->llvm_block);
6440
6441 LLVMValueRef one = LLVMConstInt(usize_type_ref, 1, false);
6442 LLVMAddCase(switch_instr, one, get_size_block);
64386443
64396444 for (size_t resume_i = 0; resume_i < fn_table_entry->resume_blocks.length; resume_i += 1) {
6440 LLVMValueRef case_value = LLVMConstInt(usize_type_ref, resume_i + 1, false);
6445 LLVMValueRef case_value = LLVMConstInt(usize_type_ref, resume_i + 2, false);
64416446 LLVMAddCase(switch_instr, case_value, fn_table_entry->resume_blocks.at(resume_i)->llvm_block);
64426447 }
64436448 }
src/ir.cpp+4-2
......@@ -24121,9 +24121,11 @@ static IrInstruction *ir_analyze_instruction_suspend_br(IrAnalyze *ira, IrInstru
2412124121
2412224122 ZigFn *fn_entry = exec_fn_entry(ira->new_irb.exec);
2412324123 ir_assert(fn_entry != nullptr, &instruction->base);
24124
24125 // +2 - one for the GetSize block, one for the Entry block, resume blocks are indexed after that.
24126 new_bb->resume_index = fn_entry->resume_blocks.length + 2;
24127
2412424128 fn_entry->resume_blocks.append(new_bb);
24125 // This is done after appending the block because resume_index 0 is reserved for querying the size.
24126 new_bb->resume_index = fn_entry->resume_blocks.length;
2412724129
2412824130 ir_push_resume_block(ira, old_dest_block);
2412924131