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) {...@@ -1549,11 +1549,19 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {
1549 LLVMValueRef offset_buf_ptr = LLVMConstInBoundsGEP(global_array, offset_ptr_indices, 2);1549 LLVMValueRef offset_buf_ptr = LLVMConstInBoundsGEP(global_array, offset_ptr_indices, 2);
15501550
1551 Buf *fn_name = get_mangled_name(g, buf_create_from_str("__zig_fail_unwrap"), false);1551 Buf *fn_name = get_mangled_name(g, buf_create_from_str("__zig_fail_unwrap"), false);
1552 LLVMTypeRef arg_types[] = {1552 LLVMTypeRef fn_type_ref;
1553 get_llvm_type(g, g->ptr_to_stack_trace_type),1553 if (g->have_err_ret_tracing) {
1554 get_llvm_type(g, g->err_tag_type),1554 LLVMTypeRef arg_types[] = {
1555 };1555 get_llvm_type(g, g->ptr_to_stack_trace_type),
1556 LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 2, false);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 }
1557 LLVMValueRef fn_val = LLVMAddFunction(g->module, buf_ptr(fn_name), fn_type_ref);1565 LLVMValueRef fn_val = LLVMAddFunction(g->module, buf_ptr(fn_name), fn_type_ref);
1558 addLLVMFnAttr(fn_val, "noreturn");1566 addLLVMFnAttr(fn_val, "noreturn");
1559 addLLVMFnAttr(fn_val, "cold");1567 addLLVMFnAttr(fn_val, "cold");
...@@ -1575,7 +1583,15 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {...@@ -1575,7 +1583,15 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {
1575 LLVMPositionBuilderAtEnd(g->builder, entry_block);1583 LLVMPositionBuilderAtEnd(g->builder, entry_block);
1576 ZigLLVMClearCurrentDebugLocation(g->builder);1584 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
1580 LLVMValueRef err_table_indices[] = {1596 LLVMValueRef err_table_indices[] = {
1581 LLVMConstNull(g->builtin_types.entry_usize->llvm_type),1597 LLVMConstNull(g->builtin_types.entry_usize->llvm_type),
...@@ -1597,7 +1613,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {...@@ -1597,7 +1613,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {
1597 LLVMValueRef global_slice_len_field_ptr = LLVMBuildStructGEP(g->builder, global_slice, slice_len_index, "");1613 LLVMValueRef global_slice_len_field_ptr = LLVMBuildStructGEP(g->builder, global_slice, slice_len_index, "");
1598 gen_store(g, full_buf_len, global_slice_len_field_ptr, u8_ptr_type);1614 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
1602 LLVMPositionBuilderAtEnd(g->builder, prev_block);1618 LLVMPositionBuilderAtEnd(g->builder, prev_block);
1603 LLVMSetCurrentDebugLocation(g->builder, prev_debug_location);1619 LLVMSetCurrentDebugLocation(g->builder, prev_debug_location);
...@@ -1633,17 +1649,26 @@ static LLVMValueRef get_cur_err_ret_trace_val(CodeGen *g, Scope *scope) {...@@ -1633,17 +1649,26 @@ static LLVMValueRef get_cur_err_ret_trace_val(CodeGen *g, Scope *scope) {
16331649
1634static void gen_safety_crash_for_err(CodeGen *g, LLVMValueRef err_val, Scope *scope) {1650static void gen_safety_crash_for_err(CodeGen *g, LLVMValueRef err_val, Scope *scope) {
1635 LLVMValueRef safety_crash_err_fn = get_safety_crash_err_fn(g);1651 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);1652 LLVMValueRef call_instruction;
1637 if (err_ret_trace_val == nullptr) {1653 if (g->have_err_ret_tracing) {
1638 ZigType *ptr_to_stack_trace_type = get_ptr_to_stack_trace_type(g);1654 LLVMValueRef err_ret_trace_val = get_cur_err_ret_trace_val(g, scope);
1639 err_ret_trace_val = LLVMConstNull(get_llvm_type(g, ptr_to_stack_trace_type));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, "");
1640 }1671 }
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, "");
1647 LLVMSetTailCall(call_instruction, true);1672 LLVMSetTailCall(call_instruction, true);
1648 LLVMBuildUnreachable(g->builder);1673 LLVMBuildUnreachable(g->builder);
1649}1674}