| ... | @@ -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); |
| 1550 | | 1550 | |
| 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); |
| 1577 | | 1585 | |
| 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 | } |
| 1579 | | 1595 | |
| 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); |
| 1599 | | 1615 | |
| 1600 | gen_panic(g, global_slice, LLVMGetParam(fn_val, 0)); | 1616 | gen_panic(g, global_slice, err_ret_trace_arg); |
| 1601 | | 1617 | |
| 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) { |
| 1633 | | 1649 | |
| 1634 | static void gen_safety_crash_for_err(CodeGen *g, LLVMValueRef err_val, Scope *scope) { | 1650 | static 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 | } |