| ... | ... | @@ -1549,11 +1549,19 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { |
| 1549 | 1549 | LLVMValueRef offset_buf_ptr = LLVMConstInBoundsGEP(global_array, offset_ptr_indices, 2); |
| 1550 | 1550 | |
| 1551 | 1551 | 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 | } |
| 1557 | 1565 | LLVMValueRef fn_val = LLVMAddFunction(g->module, buf_ptr(fn_name), fn_type_ref); |
| 1558 | 1566 | addLLVMFnAttr(fn_val, "noreturn"); |
| 1559 | 1567 | addLLVMFnAttr(fn_val, "cold"); |
| ... | ... | @@ -1575,7 +1583,15 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { |
| 1575 | 1583 | LLVMPositionBuilderAtEnd(g->builder, entry_block); |
| 1576 | 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 | 1596 | LLVMValueRef err_table_indices[] = { |
| 1581 | 1597 | LLVMConstNull(g->builtin_types.entry_usize->llvm_type), |
| ... | ... | @@ -1597,7 +1613,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { |
| 1597 | 1613 | LLVMValueRef global_slice_len_field_ptr = LLVMBuildStructGEP(g->builder, global_slice, slice_len_index, ""); |
| 1598 | 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 | 1618 | LLVMPositionBuilderAtEnd(g->builder, prev_block); |
| 1603 | 1619 | LLVMSetCurrentDebugLocation(g->builder, prev_debug_location); |
| ... | ... | @@ -1633,17 +1649,26 @@ static LLVMValueRef get_cur_err_ret_trace_val(CodeGen *g, Scope *scope) { |
| 1633 | 1649 | |
| 1634 | 1650 | static void gen_safety_crash_for_err(CodeGen *g, LLVMValueRef err_val, Scope *scope) { |
| 1635 | 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); |
| 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, ""); |
| 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 | 1672 | LLVMSetTailCall(call_instruction, true); |
| 1648 | 1673 | LLVMBuildUnreachable(g->builder); |
| 1649 | 1674 | } |