From 6053ca4f69e490c744384bd02e89df595ff7b085 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 21 Jul 2019 17:10:16 -0400 Subject: fix not jumping to entry --- src/codegen.cpp | 13 +++++++++---- src/ir.cpp | 6 ++++-- 2 files changed, 13 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/codegen.cpp b/src/codegen.cpp index 85784e5ac5..47804d91f6 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -6413,6 +6413,7 @@ static void do_code_gen(CodeGen *g) { ZigLLVMSetCurrentDebugLocation(g->builder, (int)source_node->line + 1, (int)source_node->column + 1, get_di_scope(g, fn_table_entry->child_scope)); } + IrExecutable *executable = &fn_table_entry->analyzed_executable; LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type; LLVMBasicBlockRef bad_resume_block = LLVMAppendBasicBlock(g->cur_fn_val, "BadResume"); LLVMPositionBuilderAtEnd(g->builder, bad_resume_block); @@ -6429,15 +6430,19 @@ static void do_code_gen(CodeGen *g) { LLVMValueRef resume_index_ptr = LLVMBuildStructGEP(g->builder, g->cur_ret_ptr, coro_resume_index_index, ""); LLVMValueRef resume_index = LLVMBuildLoad(g->builder, resume_index_ptr, ""); - // The +1 is because index 0 is reserved for getting the size. + // +1 - index 0 is reserved for the entry block + // +1 - index 1 is reserved for getting the size. LLVMValueRef switch_instr = LLVMBuildSwitch(g->builder, resume_index, bad_resume_block, - fn_table_entry->resume_blocks.length + 1); + fn_table_entry->resume_blocks.length + 2); LLVMValueRef zero = LLVMConstNull(usize_type_ref); - LLVMAddCase(switch_instr, zero, get_size_block); + LLVMAddCase(switch_instr, zero, executable->basic_block_list.at(0)->llvm_block); + + LLVMValueRef one = LLVMConstInt(usize_type_ref, 1, false); + LLVMAddCase(switch_instr, one, get_size_block); for (size_t resume_i = 0; resume_i < fn_table_entry->resume_blocks.length; resume_i += 1) { - LLVMValueRef case_value = LLVMConstInt(usize_type_ref, resume_i + 1, false); + LLVMValueRef case_value = LLVMConstInt(usize_type_ref, resume_i + 2, false); LLVMAddCase(switch_instr, case_value, fn_table_entry->resume_blocks.at(resume_i)->llvm_block); } } diff --git a/src/ir.cpp b/src/ir.cpp index 96d355bc95..2b3462772f 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -24121,9 +24121,11 @@ static IrInstruction *ir_analyze_instruction_suspend_br(IrAnalyze *ira, IrInstru ZigFn *fn_entry = exec_fn_entry(ira->new_irb.exec); ir_assert(fn_entry != nullptr, &instruction->base); + + // +2 - one for the GetSize block, one for the Entry block, resume blocks are indexed after that. + new_bb->resume_index = fn_entry->resume_blocks.length + 2; + fn_entry->resume_blocks.append(new_bb); - // This is done after appending the block because resume_index 0 is reserved for querying the size. - new_bb->resume_index = fn_entry->resume_blocks.length; ir_push_resume_block(ira, old_dest_block); -- cgit v1.2.3