mirror of
https://github.com/ziglang/zig.git
synced 2025-12-12 01:03:13 +00:00
codegen: fix not putting llvm allocas together
This commit is contained in:
parent
d26905c102
commit
e4083b7391
@ -5502,38 +5502,19 @@ static void do_code_gen(CodeGen *g) {
|
|||||||
g->cur_err_ret_trace_val_arg = nullptr;
|
g->cur_err_ret_trace_val_arg = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// error return tracing setup
|
||||||
bool is_async = fn_table_entry->type_entry->data.fn.fn_type_id.cc == CallingConventionAsync;
|
bool is_async = fn_table_entry->type_entry->data.fn.fn_type_id.cc == CallingConventionAsync;
|
||||||
bool have_err_ret_trace_stack = g->have_err_ret_tracing && fn_table_entry->calls_or_awaits_errorable_fn &&
|
bool have_err_ret_trace_stack = g->have_err_ret_tracing && fn_table_entry->calls_or_awaits_errorable_fn &&
|
||||||
(is_async || !have_err_ret_trace_arg);
|
(is_async || !have_err_ret_trace_arg);
|
||||||
bool have_exactly_one_err_ret_value = !have_err_ret_trace_stack && g->have_err_ret_tracing && is_async &&
|
bool have_exactly_one_err_ret_value = !have_err_ret_trace_stack && g->have_err_ret_tracing && is_async &&
|
||||||
type_can_fail(fn_table_entry->type_entry->data.fn.fn_type_id.return_type);
|
type_can_fail(fn_table_entry->type_entry->data.fn.fn_type_id.return_type);
|
||||||
|
LLVMValueRef err_ret_array_val = nullptr;
|
||||||
if (have_err_ret_trace_stack || have_exactly_one_err_ret_value) {
|
if (have_err_ret_trace_stack || have_exactly_one_err_ret_value) {
|
||||||
TypeTableEntry *usize = g->builtin_types.entry_usize;
|
|
||||||
uint32_t ret_addr_count = have_exactly_one_err_ret_value ? 1 : stack_trace_ptr_count;
|
uint32_t ret_addr_count = have_exactly_one_err_ret_value ? 1 : stack_trace_ptr_count;
|
||||||
TypeTableEntry *array_type = get_array_type(g, usize, ret_addr_count);
|
TypeTableEntry *array_type = get_array_type(g, g->builtin_types.entry_usize, ret_addr_count);
|
||||||
LLVMValueRef err_ret_array_val = build_alloca(g, array_type, "error_return_trace_addresses",
|
err_ret_array_val = build_alloca(g, array_type, "error_return_trace_addresses",
|
||||||
get_abi_alignment(g, array_type));
|
get_abi_alignment(g, array_type));
|
||||||
g->cur_err_ret_trace_val_stack = build_alloca(g, g->stack_trace_type, "error_return_trace", get_abi_alignment(g, g->stack_trace_type));
|
g->cur_err_ret_trace_val_stack = build_alloca(g, g->stack_trace_type, "error_return_trace", get_abi_alignment(g, g->stack_trace_type));
|
||||||
size_t index_field_index = g->stack_trace_type->data.structure.fields[0].gen_index;
|
|
||||||
LLVMValueRef index_field_ptr = LLVMBuildStructGEP(g->builder, g->cur_err_ret_trace_val_stack, (unsigned)index_field_index, "");
|
|
||||||
gen_store_untyped(g, LLVMConstNull(usize->type_ref), index_field_ptr, 0, false);
|
|
||||||
|
|
||||||
size_t addresses_field_index = g->stack_trace_type->data.structure.fields[1].gen_index;
|
|
||||||
LLVMValueRef addresses_field_ptr = LLVMBuildStructGEP(g->builder, g->cur_err_ret_trace_val_stack, (unsigned)addresses_field_index, "");
|
|
||||||
|
|
||||||
TypeTableEntry *slice_type = g->stack_trace_type->data.structure.fields[1].type_entry;
|
|
||||||
size_t ptr_field_index = slice_type->data.structure.fields[slice_ptr_index].gen_index;
|
|
||||||
LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP(g->builder, addresses_field_ptr, (unsigned)ptr_field_index, "");
|
|
||||||
LLVMValueRef zero = LLVMConstNull(usize->type_ref);
|
|
||||||
LLVMValueRef indices[] = {zero, zero};
|
|
||||||
LLVMValueRef err_ret_array_val_elem0_ptr = LLVMBuildInBoundsGEP(g->builder, err_ret_array_val,
|
|
||||||
indices, 2, "");
|
|
||||||
gen_store(g, err_ret_array_val_elem0_ptr, ptr_field_ptr,
|
|
||||||
get_pointer_to_type(g, get_pointer_to_type(g, usize, false), false));
|
|
||||||
|
|
||||||
size_t len_field_index = slice_type->data.structure.fields[slice_len_index].gen_index;
|
|
||||||
LLVMValueRef len_field_ptr = LLVMBuildStructGEP(g->builder, addresses_field_ptr, (unsigned)len_field_index, "");
|
|
||||||
gen_store(g, LLVMConstInt(usize->type_ref, ret_addr_count, false), len_field_ptr, get_pointer_to_type(g, usize, false));
|
|
||||||
} else {
|
} else {
|
||||||
g->cur_err_ret_trace_val_stack = nullptr;
|
g->cur_err_ret_trace_val_stack = nullptr;
|
||||||
}
|
}
|
||||||
@ -5628,6 +5609,32 @@ static void do_code_gen(CodeGen *g) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// finishing error return trace setup. we have to do this after all the allocas.
|
||||||
|
if (have_err_ret_trace_stack || have_exactly_one_err_ret_value) {
|
||||||
|
uint32_t ret_addr_count = have_exactly_one_err_ret_value ? 1 : stack_trace_ptr_count;
|
||||||
|
TypeTableEntry *usize = g->builtin_types.entry_usize;
|
||||||
|
size_t index_field_index = g->stack_trace_type->data.structure.fields[0].gen_index;
|
||||||
|
LLVMValueRef index_field_ptr = LLVMBuildStructGEP(g->builder, g->cur_err_ret_trace_val_stack, (unsigned)index_field_index, "");
|
||||||
|
gen_store_untyped(g, LLVMConstNull(usize->type_ref), index_field_ptr, 0, false);
|
||||||
|
|
||||||
|
size_t addresses_field_index = g->stack_trace_type->data.structure.fields[1].gen_index;
|
||||||
|
LLVMValueRef addresses_field_ptr = LLVMBuildStructGEP(g->builder, g->cur_err_ret_trace_val_stack, (unsigned)addresses_field_index, "");
|
||||||
|
|
||||||
|
TypeTableEntry *slice_type = g->stack_trace_type->data.structure.fields[1].type_entry;
|
||||||
|
size_t ptr_field_index = slice_type->data.structure.fields[slice_ptr_index].gen_index;
|
||||||
|
LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP(g->builder, addresses_field_ptr, (unsigned)ptr_field_index, "");
|
||||||
|
LLVMValueRef zero = LLVMConstNull(usize->type_ref);
|
||||||
|
LLVMValueRef indices[] = {zero, zero};
|
||||||
|
LLVMValueRef err_ret_array_val_elem0_ptr = LLVMBuildInBoundsGEP(g->builder, err_ret_array_val,
|
||||||
|
indices, 2, "");
|
||||||
|
TypeTableEntry *ptr_ptr_usize_type = get_pointer_to_type(g, get_pointer_to_type(g, usize, false), false);
|
||||||
|
gen_store(g, err_ret_array_val_elem0_ptr, ptr_field_ptr, ptr_ptr_usize_type);
|
||||||
|
|
||||||
|
size_t len_field_index = slice_type->data.structure.fields[slice_len_index].gen_index;
|
||||||
|
LLVMValueRef len_field_ptr = LLVMBuildStructGEP(g->builder, addresses_field_ptr, (unsigned)len_field_index, "");
|
||||||
|
gen_store(g, LLVMConstInt(usize->type_ref, ret_addr_count, false), len_field_ptr, get_pointer_to_type(g, usize, false));
|
||||||
|
}
|
||||||
|
|
||||||
FnTypeId *fn_type_id = &fn_table_entry->type_entry->data.fn.fn_type_id;
|
FnTypeId *fn_type_id = &fn_table_entry->type_entry->data.fn.fn_type_id;
|
||||||
|
|
||||||
// create debug variable declarations for parameters
|
// create debug variable declarations for parameters
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user