authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-11 21:14:19-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-11 21:14:19-04:00
log62c5bc6058a64c411c49f84cdbd6994c24c91e00
tree881c3a0b13f7edba3e45074d41dd39af3ccedada
parent4d8d513e16d308131846d98267bc844bf702e9ce
signature Commit is signed but in an unrecognized format.

fix cancel invoking branch on undefined memory


1 files changed, 18 insertions(+), 0 deletions(-)

src/codegen.cpp+18
...@@ -1163,6 +1163,17 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) {...@@ -1163,6 +1163,17 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) {
1163 LLVMValueRef return_address_ptr = LLVMBuildCall(g->builder, get_return_address_fn_val(g), &zero, 1, "");1163 LLVMValueRef return_address_ptr = LLVMBuildCall(g->builder, get_return_address_fn_val(g), &zero, 1, "");
1164 LLVMValueRef return_address = LLVMBuildPtrToInt(g->builder, return_address_ptr, usize_type_ref, "");1164 LLVMValueRef return_address = LLVMBuildPtrToInt(g->builder, return_address_ptr, usize_type_ref, "");
11651165
1166 LLVMBasicBlockRef return_block = LLVMAppendBasicBlock(fn_val, "Return");
1167 LLVMBasicBlockRef dest_non_null_block = LLVMAppendBasicBlock(fn_val, "DestNonNull");
1168
1169 LLVMValueRef null_dest_bit = LLVMBuildICmp(g->builder, LLVMIntEQ, err_ret_trace_ptr,
1170 LLVMConstNull(LLVMTypeOf(err_ret_trace_ptr)), "");
1171 LLVMBuildCondBr(g->builder, null_dest_bit, return_block, dest_non_null_block);
1172
1173 LLVMPositionBuilderAtEnd(g->builder, return_block);
1174 LLVMBuildRetVoid(g->builder);
1175
1176 LLVMPositionBuilderAtEnd(g->builder, dest_non_null_block);
1166 LLVMValueRef args[] = { err_ret_trace_ptr, return_address };1177 LLVMValueRef args[] = { err_ret_trace_ptr, return_address };
1167 ZigLLVMBuildCall(g->builder, add_error_return_trace_addr_fn_val, args, 2, get_llvm_cc(g, CallingConventionUnspecified), ZigLLVM_FnInlineAlways, "");1178 ZigLLVMBuildCall(g->builder, add_error_return_trace_addr_fn_val, args, 2, get_llvm_cc(g, CallingConventionUnspecified), ZigLLVM_FnInlineAlways, "");
1168 LLVMBuildRetVoid(g->builder);1179 LLVMBuildRetVoid(g->builder);
...@@ -5497,6 +5508,13 @@ static LLVMValueRef ir_render_cancel(CodeGen *g, IrExecutable *executable, IrIns...@@ -5497,6 +5508,13 @@ static LLVMValueRef ir_render_cancel(CodeGen *g, IrExecutable *executable, IrIns
5497 LLVMValueRef target_frame_ptr = ir_llvm_value(g, instruction->frame);5508 LLVMValueRef target_frame_ptr = ir_llvm_value(g, instruction->frame);
5498 LLVMBasicBlockRef resume_bb = gen_suspend_begin(g, "CancelResume");5509 LLVMBasicBlockRef resume_bb = gen_suspend_begin(g, "CancelResume");
54995510
5511 // supply null for the awaiter return pointer (no copy needed)
5512 if (type_has_bits(result_type)) {
5513 LLVMValueRef awaiter_ret_ptr_ptr = LLVMBuildStructGEP(g->builder, target_frame_ptr, coro_ret_start + 1, "");
5514 LLVMBuildStore(g->builder, LLVMConstNull(LLVMGetElementType(LLVMTypeOf(awaiter_ret_ptr_ptr))),
5515 awaiter_ret_ptr_ptr);
5516 }
5517
5500 // supply null for the error return trace pointer5518 // supply null for the error return trace pointer
5501 if (codegen_fn_has_err_ret_tracing_arg(g, result_type)) {5519 if (codegen_fn_has_err_ret_tracing_arg(g, result_type)) {
5502 LLVMValueRef err_ret_trace_ptr_ptr = LLVMBuildStructGEP(g->builder, target_frame_ptr,5520 LLVMValueRef err_ret_trace_ptr_ptr = LLVMBuildStructGEP(g->builder, target_frame_ptr,