| ... | @@ -6413,6 +6413,7 @@ static void do_code_gen(CodeGen *g) { | ... | @@ -6413,6 +6413,7 @@ static void do_code_gen(CodeGen *g) { |
| 6413 | ZigLLVMSetCurrentDebugLocation(g->builder, (int)source_node->line + 1, | 6413 | ZigLLVMSetCurrentDebugLocation(g->builder, (int)source_node->line + 1, |
| 6414 | (int)source_node->column + 1, get_di_scope(g, fn_table_entry->child_scope)); | 6414 | (int)source_node->column + 1, get_di_scope(g, fn_table_entry->child_scope)); |
| 6415 | } | 6415 | } |
| | 6416 | IrExecutable *executable = &fn_table_entry->analyzed_executable; |
| 6416 | LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type; | 6417 | LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type; |
| 6417 | LLVMBasicBlockRef bad_resume_block = LLVMAppendBasicBlock(g->cur_fn_val, "BadResume"); | 6418 | LLVMBasicBlockRef bad_resume_block = LLVMAppendBasicBlock(g->cur_fn_val, "BadResume"); |
| 6418 | LLVMPositionBuilderAtEnd(g->builder, bad_resume_block); | 6419 | LLVMPositionBuilderAtEnd(g->builder, bad_resume_block); |
| ... | @@ -6429,15 +6430,19 @@ static void do_code_gen(CodeGen *g) { | ... | @@ -6429,15 +6430,19 @@ static void do_code_gen(CodeGen *g) { |
| 6429 | LLVMValueRef resume_index_ptr = LLVMBuildStructGEP(g->builder, g->cur_ret_ptr, | 6430 | LLVMValueRef resume_index_ptr = LLVMBuildStructGEP(g->builder, g->cur_ret_ptr, |
| 6430 | coro_resume_index_index, ""); | 6431 | coro_resume_index_index, ""); |
| 6431 | LLVMValueRef resume_index = LLVMBuildLoad(g->builder, resume_index_ptr, ""); | 6432 | 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. |
| 6433 | LLVMValueRef switch_instr = LLVMBuildSwitch(g->builder, resume_index, bad_resume_block, | 6435 | 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); |
| 6435 | | 6437 | |
| 6436 | LLVMValueRef zero = LLVMConstNull(usize_type_ref); | 6438 | 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); |
| 6438 | | 6443 | |
| 6439 | for (size_t resume_i = 0; resume_i < fn_table_entry->resume_blocks.length; resume_i += 1) { | 6444 | 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); |
| 6441 | LLVMAddCase(switch_instr, case_value, fn_table_entry->resume_blocks.at(resume_i)->llvm_block); | 6446 | LLVMAddCase(switch_instr, case_value, fn_table_entry->resume_blocks.at(resume_i)->llvm_block); |
| 6442 | } | 6447 | } |
| 6443 | } | 6448 | } |