authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-15 20:17:06-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-15 20:17:06-04:00
log579dd7411462a1359a08e8b4c0b4b9765d54a563
tree9650367f638ba4480956f2d951e8758e2a4c31f1
parentf5d84250a3cbe113c46d9f07b8edf634e39afcec
signaturelock-open Commit is signed but in an unrecognized format.

fix Debug mode when error return tracing is off

Previously the code for generating a panic crash expected one of the parameters to be the error return trace. Now it does not expect that parameter when g->have_err_ret_tracing is false. Closes #2276

1 files changed, 42 insertions(+), 17 deletions(-)

src/codegen.cpp+42-17
......@@ -1549,11 +1549,19 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {
15491549 LLVMValueRef offset_buf_ptr = LLVMConstInBoundsGEP(global_array, offset_ptr_indices, 2);
15501550
15511551 Buf *fn_name = get_mangled_name(g, buf_create_from_str("__zig_fail_unwrap"), false);
1552 LLVMTypeRef arg_types[] = {
1553 get_llvm_type(g, g->ptr_to_stack_trace_type),
1554 get_llvm_type(g, g->err_tag_type),
1555 };
1556 LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 2, false);
1552 LLVMTypeRef fn_type_ref;
1553 if (g->have_err_ret_tracing) {
1554 LLVMTypeRef arg_types[] = {
1555 get_llvm_type(g, g->ptr_to_stack_trace_type),
1556 get_llvm_type(g, g->err_tag_type),
1557 };
1558 fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 2, false);
1559 } else {
1560 LLVMTypeRef arg_types[] = {
1561 get_llvm_type(g, g->err_tag_type),
1562 };
1563 fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 1, false);
1564 }
15571565 LLVMValueRef fn_val = LLVMAddFunction(g->module, buf_ptr(fn_name), fn_type_ref);
15581566 addLLVMFnAttr(fn_val, "noreturn");
15591567 addLLVMFnAttr(fn_val, "cold");
......@@ -1575,7 +1583,15 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {
15751583 LLVMPositionBuilderAtEnd(g->builder, entry_block);
15761584 ZigLLVMClearCurrentDebugLocation(g->builder);
15771585
1578 LLVMValueRef err_val = LLVMGetParam(fn_val, 1);
1586 LLVMValueRef err_ret_trace_arg;
1587 LLVMValueRef err_val;
1588 if (g->have_err_ret_tracing) {
1589 err_ret_trace_arg = LLVMGetParam(fn_val, 0);
1590 err_val = LLVMGetParam(fn_val, 1);
1591 } else {
1592 err_ret_trace_arg = nullptr;
1593 err_val = LLVMGetParam(fn_val, 0);
1594 }
15791595
15801596 LLVMValueRef err_table_indices[] = {
15811597 LLVMConstNull(g->builtin_types.entry_usize->llvm_type),
......@@ -1597,7 +1613,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {
15971613 LLVMValueRef global_slice_len_field_ptr = LLVMBuildStructGEP(g->builder, global_slice, slice_len_index, "");
15981614 gen_store(g, full_buf_len, global_slice_len_field_ptr, u8_ptr_type);
15991615
1600 gen_panic(g, global_slice, LLVMGetParam(fn_val, 0));
1616 gen_panic(g, global_slice, err_ret_trace_arg);
16011617
16021618 LLVMPositionBuilderAtEnd(g->builder, prev_block);
16031619 LLVMSetCurrentDebugLocation(g->builder, prev_debug_location);
......@@ -1633,17 +1649,26 @@ static LLVMValueRef get_cur_err_ret_trace_val(CodeGen *g, Scope *scope) {
16331649
16341650static void gen_safety_crash_for_err(CodeGen *g, LLVMValueRef err_val, Scope *scope) {
16351651 LLVMValueRef safety_crash_err_fn = get_safety_crash_err_fn(g);
1636 LLVMValueRef err_ret_trace_val = get_cur_err_ret_trace_val(g, scope);
1637 if (err_ret_trace_val == nullptr) {
1638 ZigType *ptr_to_stack_trace_type = get_ptr_to_stack_trace_type(g);
1639 err_ret_trace_val = LLVMConstNull(get_llvm_type(g, ptr_to_stack_trace_type));
1652 LLVMValueRef call_instruction;
1653 if (g->have_err_ret_tracing) {
1654 LLVMValueRef err_ret_trace_val = get_cur_err_ret_trace_val(g, scope);
1655 if (err_ret_trace_val == nullptr) {
1656 ZigType *ptr_to_stack_trace_type = get_ptr_to_stack_trace_type(g);
1657 err_ret_trace_val = LLVMConstNull(get_llvm_type(g, ptr_to_stack_trace_type));
1658 }
1659 LLVMValueRef args[] = {
1660 err_ret_trace_val,
1661 err_val,
1662 };
1663 call_instruction = ZigLLVMBuildCall(g->builder, safety_crash_err_fn, args, 2,
1664 get_llvm_cc(g, CallingConventionUnspecified), ZigLLVM_FnInlineAuto, "");
1665 } else {
1666 LLVMValueRef args[] = {
1667 err_val,
1668 };
1669 call_instruction = ZigLLVMBuildCall(g->builder, safety_crash_err_fn, args, 1,
1670 get_llvm_cc(g, CallingConventionUnspecified), ZigLLVM_FnInlineAuto, "");
16401671 }
1641 LLVMValueRef args[] = {
1642 err_ret_trace_val,
1643 err_val,
1644 };
1645 LLVMValueRef call_instruction = ZigLLVMBuildCall(g->builder, safety_crash_err_fn, args, 2, get_llvm_cc(g, CallingConventionUnspecified),
1646 ZigLLVM_FnInlineAuto, "");
16471672 LLVMSetTailCall(call_instruction, true);
16481673 LLVMBuildUnreachable(g->builder);
16491674}