authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-08-01 23:26:36-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-08-01 23:26:36-07:00
log44f833129c81bfa7117743fc7d54c44db09cc240
tree12f9d4dcf288019db49293c55935edca7e9262ab
parent9e4091200e165db808216ad2a340c6ed4f18c494

LLVM backends: work around poorly designed C API

As part of the Opaque Pointers upgrade documentation, LLVM says that the function LLVMGetGEPSourceElementType() can be used to obtain element type information in lieu of LLVMGetElementType(), however, this function actually returns the struct type, not the field type. The GEP instruction does store the information we need, however, this is not exposed in the C API. It seems like they accidentally exposed the wrong field, because one would never need the struct type since one must already pass it directly to the GEP instruction, so one will always have it handy, whereas one will usually not have the field type handy.

5 files changed, 52 insertions(+), 49 deletions(-)

src/codegen/llvm.zig+4-4
......@@ -4901,7 +4901,7 @@ pub const FuncGen = struct {
49014901 if (isByRef(payload_ty)) {
49024902 return payload_ptr;
49034903 }
4904 const load_inst = fg.builder.buildLoad(payload_ptr.getGEPSourceElementType(), payload_ptr, "");
4904 const load_inst = fg.builder.buildLoad(payload_ptr.getGEPResultElementType(), payload_ptr, "");
49054905 load_inst.setAlignment(payload_ty.abiAlignment(target));
49064906 return load_inst;
49074907 }
......@@ -6043,7 +6043,7 @@ pub const FuncGen = struct {
60436043 if (isByRef(payload_ty)) {
60446044 return payload_ptr;
60456045 }
6046 const load_inst = self.builder.buildLoad(payload_ptr.getGEPSourceElementType(), payload_ptr, "");
6046 const load_inst = self.builder.buildLoad(payload_ptr.getGEPResultElementType(), payload_ptr, "");
60476047 load_inst.setAlignment(payload_ty.abiAlignment(target));
60486048 return load_inst;
60496049 }
......@@ -7820,7 +7820,7 @@ pub const FuncGen = struct {
78207820 }
78217821 const tag_index = @boolToInt(layout.tag_align < layout.payload_align);
78227822 const tag_field_ptr = self.builder.buildStructGEP(llvm_un_ty, union_handle, tag_index, "");
7823 return self.builder.buildLoad(tag_field_ptr.getGEPSourceElementType(), tag_field_ptr, "");
7823 return self.builder.buildLoad(tag_field_ptr.getGEPResultElementType(), tag_field_ptr, "");
78247824 } else {
78257825 if (layout.payload_size == 0) {
78267826 return union_handle;
......@@ -8671,7 +8671,7 @@ pub const FuncGen = struct {
86718671 }
86728672 const target = fg.dg.module.getTarget();
86738673 const payload_alignment = payload_ty.abiAlignment(target);
8674 const load_inst = fg.builder.buildLoad(payload_ptr.getGEPSourceElementType(), payload_ptr, "");
8674 const load_inst = fg.builder.buildLoad(payload_ptr.getGEPResultElementType(), payload_ptr, "");
86758675 load_inst.setAlignment(payload_alignment);
86768676 return load_inst;
86778677 }
src/codegen/llvm/bindings.zig+2-2
......@@ -242,8 +242,8 @@ pub const Value = opaque {
242242 pub const addFunctionAttr = ZigLLVMAddFunctionAttr;
243243 extern fn ZigLLVMAddFunctionAttr(Fn: *const Value, attr_name: [*:0]const u8, attr_value: [*:0]const u8) void;
244244
245 pub const getGEPSourceElementType = LLVMGetGEPSourceElementType;
246 extern fn LLVMGetGEPSourceElementType(GEP: *const Value) *const Type;
245 pub const getGEPResultElementType = ZigLLVMGetGEPResultElementType;
246 extern fn ZigLLVMGetGEPResultElementType(GEP: *const Value) *const Type;
247247};
248248
249249pub const Type = opaque {
src/stage1/codegen.cpp+40-43
......@@ -1276,16 +1276,16 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) {
12761276 ZigType *slice_type = g->stack_trace_type->data.structure.fields[1]->type_entry;
12771277 size_t ptr_field_index = slice_type->data.structure.fields[slice_ptr_index]->gen_index;
12781278 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP2(g->builder,
1279 LLVMGetGEPSourceElementType(addresses_field_ptr),
1279 ZigLLVMGetGEPResultElementType(addresses_field_ptr),
12801280 addresses_field_ptr, (unsigned)ptr_field_index, "");
12811281 size_t len_field_index = slice_type->data.structure.fields[slice_len_index]->gen_index;
12821282 LLVMValueRef len_field_ptr = LLVMBuildStructGEP2(g->builder,
1283 LLVMGetGEPSourceElementType(addresses_field_ptr),
1283 ZigLLVMGetGEPResultElementType(addresses_field_ptr),
12841284 addresses_field_ptr, (unsigned)len_field_index, "");
12851285
1286 LLVMValueRef len_value = gen_load_untyped(g, LLVMGetGEPSourceElementType(len_field_ptr),
1286 LLVMValueRef len_value = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(len_field_ptr),
12871287 len_field_ptr, 0, false, "");
1288 LLVMValueRef index_val = gen_load_untyped(g, LLVMGetGEPSourceElementType(index_field_ptr),
1288 LLVMValueRef index_val = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(index_field_ptr),
12891289 index_field_ptr, 0, false, "");
12901290 LLVMValueRef len_val_minus_one = LLVMBuildSub(g->builder, len_value, LLVMConstInt(usize_type_ref, 1, false), "");
12911291 LLVMValueRef masked_val = LLVMBuildAnd(g->builder, index_val, len_val_minus_one, "");
......@@ -1293,7 +1293,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) {
12931293 masked_val,
12941294 };
12951295
1296 LLVMValueRef ptr_value = gen_load_untyped(g, LLVMGetGEPSourceElementType(ptr_field_ptr),
1296 LLVMValueRef ptr_value = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(ptr_field_ptr),
12971297 ptr_field_ptr, 0, false, "");
12981298 LLVMValueRef address_slot = LLVMBuildInBoundsGEP2(g->builder, usize_type_ref, ptr_value, address_indices, 1, "");
12991299
......@@ -1455,22 +1455,19 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {
14551455 }
14561456
14571457 // Fetch the error name from the global table
1458 LLVMValueRef err_table_indices[] = {
1459 LLVMConstNull(usize_ty->llvm_type),
1460 err_val,
1461 };
1458 LLVMValueRef err_table_indices[] = { err_val };
14621459 LLVMValueRef err_name_val = LLVMBuildInBoundsGEP2(g->builder,
14631460 get_llvm_type(g, str_type),
14641461 g->err_name_table, err_table_indices, 2, "");
14651462
14661463 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP2(g->builder,
1467 LLVMGetGEPSourceElementType(err_name_val), err_name_val, slice_ptr_index, "");
1468 LLVMValueRef err_name_ptr = gen_load_untyped(g, LLVMGetGEPSourceElementType(ptr_field_ptr),
1464 ZigLLVMGetGEPResultElementType(err_name_val), err_name_val, slice_ptr_index, "");
1465 LLVMValueRef err_name_ptr = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(ptr_field_ptr),
14691466 ptr_field_ptr, 0, false, "");
14701467
14711468 LLVMValueRef len_field_ptr = LLVMBuildStructGEP2(g->builder,
1472 LLVMGetGEPSourceElementType(err_name_val), err_name_val, slice_len_index, "");
1473 LLVMValueRef err_name_len = gen_load_untyped(g, LLVMGetGEPSourceElementType(len_field_ptr),
1469 ZigLLVMGetGEPResultElementType(err_name_val), err_name_val, slice_len_index, "");
1470 LLVMValueRef err_name_len = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(len_field_ptr),
14741471 len_field_ptr, 0, false, "");
14751472
14761473 LLVMValueRef msg_prefix_len = LLVMConstInt(usize_ty->llvm_type, strlen(unwrap_err_msg_text), false);
......@@ -2374,7 +2371,7 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_
23742371 LLVMValueRef adjusted_ptr_to_struct = LLVMBuildStructGEP2(g->builder,
23752372 abi_type, val, i, "");
23762373 LLVMValueRef loaded = LLVMBuildLoad2(g->builder,
2377 LLVMGetGEPSourceElementType(adjusted_ptr_to_struct),
2374 ZigLLVMGetGEPResultElementType(adjusted_ptr_to_struct),
23782375 adjusted_ptr_to_struct, "");
23792376 fn_walk->data.call.gen_param_values->append(loaded);
23802377 }
......@@ -2621,18 +2618,18 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) {
26212618 ZigType *slice_type = g->stack_trace_type->data.structure.fields[1]->type_entry;
26222619 size_t ptr_field_index = slice_type->data.structure.fields[slice_ptr_index]->gen_index;
26232620 LLVMValueRef src_ptr_field_ptr = LLVMBuildStructGEP2(g->builder,
2624 LLVMGetGEPSourceElementType(src_addresses_field_ptr),
2621 ZigLLVMGetGEPResultElementType(src_addresses_field_ptr),
26252622 src_addresses_field_ptr, (unsigned)ptr_field_index, "");
26262623 size_t len_field_index = slice_type->data.structure.fields[slice_len_index]->gen_index;
26272624 LLVMValueRef src_len_field_ptr = LLVMBuildStructGEP2(g->builder,
2628 LLVMGetGEPSourceElementType(src_addresses_field_ptr),
2625 ZigLLVMGetGEPResultElementType(src_addresses_field_ptr),
26292626 src_addresses_field_ptr, (unsigned)len_field_index, "");
26302627 LLVMValueRef src_index_val = LLVMBuildLoad2(g->builder,
2631 LLVMGetGEPSourceElementType(src_index_field_ptr), src_index_field_ptr, "");
2628 ZigLLVMGetGEPResultElementType(src_index_field_ptr), src_index_field_ptr, "");
26322629 LLVMValueRef src_ptr_val = LLVMBuildLoad2(g->builder,
2633 LLVMGetGEPSourceElementType(src_ptr_field_ptr), src_ptr_field_ptr, "");
2630 ZigLLVMGetGEPResultElementType(src_ptr_field_ptr), src_ptr_field_ptr, "");
26342631 LLVMValueRef src_len_val = LLVMBuildLoad2(g->builder,
2635 LLVMGetGEPSourceElementType(src_len_field_ptr), src_len_field_ptr, "");
2632 ZigLLVMGetGEPResultElementType(src_len_field_ptr), src_len_field_ptr, "");
26362633 LLVMValueRef no_wrap_bit = LLVMBuildICmp(g->builder, LLVMIntULT, src_index_val, src_len_val, "");
26372634 LLVMBasicBlockRef no_wrap_block = LLVMAppendBasicBlock(fn_val, "NoWrap");
26382635 LLVMBasicBlockRef yes_wrap_block = LLVMAppendBasicBlock(fn_val, "YesWrap");
......@@ -2658,7 +2655,7 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) {
26582655 LLVMValueRef ptr_index = LLVMBuildLoad2(g->builder, usize_type_ref, frame_index_ptr, "");
26592656 LLVMValueRef addr_ptr = LLVMBuildInBoundsGEP2(g->builder,
26602657 usize_type_ref, src_ptr_val, &ptr_index, 1, "");
2661 LLVMValueRef this_addr_val = LLVMBuildLoad2(g->builder, LLVMGetGEPSourceElementType(addr_ptr),
2658 LLVMValueRef this_addr_val = LLVMBuildLoad2(g->builder, ZigLLVMGetGEPResultElementType(addr_ptr),
26622659 addr_ptr, "");
26632660 LLVMValueRef args[] = {dest_stack_trace_ptr, this_addr_val};
26642661 ZigLLVMBuildCall(g->builder, LLVMGlobalGetValueType(add_error_return_trace_addr_fn_val),
......@@ -4793,7 +4790,7 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, Stage1Air *executable, Stage1
47934790 assert(len_index != SIZE_MAX);
47944791 LLVMValueRef len_ptr = LLVMBuildStructGEP2(g->builder, get_llvm_type(g, array_type),
47954792 array_ptr, (unsigned)len_index, "");
4796 LLVMValueRef len = gen_load_untyped(g, LLVMGetGEPSourceElementType(len_ptr), len_ptr,
4793 LLVMValueRef len = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(len_ptr), len_ptr,
47974794 0, false, "");
47984795 LLVMIntPredicate upper_op = (ptr_type->data.pointer.sentinel != nullptr) ? LLVMIntULE : LLVMIntULT;
47994796 add_bounds_check(g, subscript_value, LLVMIntEQ, nullptr, upper_op, len);
......@@ -4803,7 +4800,7 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, Stage1Air *executable, Stage1
48034800 assert(ptr_index != SIZE_MAX);
48044801 LLVMValueRef ptr_ptr = LLVMBuildStructGEP2(g->builder, get_llvm_type(g, array_type),
48054802 array_ptr, (unsigned)ptr_index, "");
4806 LLVMValueRef ptr = gen_load_untyped(g, LLVMGetGEPSourceElementType(ptr_ptr), ptr_ptr, 0,
4803 LLVMValueRef ptr = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(ptr_ptr), ptr_ptr, 0,
48074804 false, "");
48084805 LLVMTypeRef elem_llvm_ty = get_llvm_type(g, ptr_type->data.pointer.child_type);
48094806 return LLVMBuildInBoundsGEP2(g->builder, elem_llvm_ty, ptr, &subscript_value, 1, "");
......@@ -4820,9 +4817,9 @@ static LLVMValueRef get_new_stack_addr(CodeGen *g, LLVMTypeRef new_stack_llvm_ty
48204817 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP2(g->builder, new_stack_llvm_ty, new_stack, (unsigned)slice_ptr_index, "");
48214818 LLVMValueRef len_field_ptr = LLVMBuildStructGEP2(g->builder, new_stack_llvm_ty, new_stack, (unsigned)slice_len_index, "");
48224819
4823 LLVMValueRef ptr_value = gen_load_untyped(g, LLVMGetGEPSourceElementType(ptr_field_ptr),
4820 LLVMValueRef ptr_value = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(ptr_field_ptr),
48244821 ptr_field_ptr, 0, false, "");
4825 LLVMValueRef len_value = gen_load_untyped(g, LLVMGetGEPSourceElementType(len_field_ptr),
4822 LLVMValueRef len_value = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(len_field_ptr),
48264823 len_field_ptr, 0, false, "");
48274824
48284825 LLVMValueRef ptr_addr = LLVMBuildPtrToInt(g->builder, ptr_value, LLVMTypeOf(len_value), "");
......@@ -4962,7 +4959,7 @@ static void gen_init_stack_trace(CodeGen *g, LLVMValueRef trace_field_ptr, LLVMV
49624959
49634960 LLVMValueRef addrs_slice_ptr = LLVMBuildStructGEP2(g->builder, stack_trace_llvm_ty, trace_field_ptr, 1, "");
49644961 LLVMValueRef addrs_ptr_ptr = LLVMBuildStructGEP2(g->builder,
4965 LLVMGetGEPSourceElementType(addrs_slice_ptr),
4962 ZigLLVMGetGEPResultElementType(addrs_slice_ptr),
49664963 addrs_slice_ptr, slice_ptr_index, "");
49674964 LLVMValueRef indices[] = { LLVMConstNull(usize_type_ref), LLVMConstNull(usize_type_ref) };
49684965 LLVMValueRef trace_field_addrs_as_ptr = LLVMBuildInBoundsGEP2(g->builder,
......@@ -4970,7 +4967,7 @@ static void gen_init_stack_trace(CodeGen *g, LLVMValueRef trace_field_ptr, LLVMV
49704967 LLVMBuildStore(g->builder, trace_field_addrs_as_ptr, addrs_ptr_ptr);
49714968
49724969 LLVMValueRef addrs_len_ptr = LLVMBuildStructGEP2(g->builder,
4973 LLVMGetGEPSourceElementType(addrs_slice_ptr),
4970 ZigLLVMGetGEPResultElementType(addrs_slice_ptr),
49744971 addrs_slice_ptr, slice_len_index, "");
49754972 LLVMBuildStore(g->builder, LLVMConstInt(usize_type_ref, stack_trace_ptr_count, false), addrs_len_ptr);
49764973}
......@@ -5064,7 +5061,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
50645061 LLVMValueRef frame_ptr_ptr = LLVMBuildStructGEP2(g->builder, frame_slice_llvm_ty,
50655062 frame_slice_ptr, slice_ptr_index, "");
50665063 LLVMValueRef frame_ptr = LLVMBuildLoad2(g->builder,
5067 LLVMGetGEPSourceElementType(frame_ptr_ptr), frame_ptr_ptr, "");
5064 ZigLLVMGetGEPResultElementType(frame_ptr_ptr), frame_ptr_ptr, "");
50685065 if (instruction->fn_entry == nullptr) {
50695066 anyframe_type = get_any_frame_type(g, src_return_type);
50705067 frame_result_loc = LLVMBuildBitCast(g->builder, frame_ptr, get_llvm_type(g, anyframe_type), "");
......@@ -5127,7 +5124,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
51275124
51285125 // Store a zero in the awaiter's result ptr to indicate we do not need a copy made.
51295126 LLVMValueRef awaiter_ret_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty, frame_result_loc, frame_ret_start + 1, "");
5130 LLVMValueRef zero_ptr = LLVMConstNull(LLVMGetGEPSourceElementType(awaiter_ret_ptr));
5127 LLVMValueRef zero_ptr = LLVMConstNull(ZigLLVMGetGEPResultElementType(awaiter_ret_ptr));
51315128 LLVMBuildStore(g->builder, zero_ptr, awaiter_ret_ptr);
51325129 }
51335130
......@@ -5145,7 +5142,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
51455142
51465143 LLVMValueRef fn_ptr_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty, frame_result_loc, frame_fn_ptr_index, "");
51475144 LLVMValueRef bitcasted_fn_val = LLVMBuildBitCast(g->builder, fn_val,
5148 LLVMGetGEPSourceElementType(fn_ptr_ptr), "");
5145 ZigLLVMGetGEPResultElementType(fn_ptr_ptr), "");
51495146 LLVMBuildStore(g->builder, bitcasted_fn_val, fn_ptr_ptr);
51505147
51515148 LLVMValueRef resume_index_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty, frame_result_loc, frame_resume_index, "");
......@@ -5362,7 +5359,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
53625359 get_llvm_type(g, instruction->new_stack->value->type->data.pointer.child_type),
53635360 frame_slice_ptr, slice_ptr_index, "");
53645361 frame_result_loc_uncasted = LLVMBuildLoad2(g->builder,
5365 LLVMGetGEPSourceElementType(frame_ptr_ptr), frame_ptr_ptr, "");
5362 ZigLLVMGetGEPResultElementType(frame_ptr_ptr), frame_ptr_ptr, "");
53665363 }
53675364 if (frame_result_loc_uncasted != nullptr) {
53685365 if (instruction->fn_entry != nullptr) {
......@@ -5551,7 +5548,7 @@ static LLVMValueRef ir_render_union_field_ptr(CodeGen *g, Stage1Air *executable,
55515548 LLVMValueRef tag_field_ptr = LLVMBuildStructGEP2(g->builder,
55525549 get_llvm_type(g, union_type),
55535550 union_ptr, union_type->data.unionation.gen_tag_index, "");
5554 LLVMValueRef tag_value = gen_load_untyped(g, LLVMGetGEPSourceElementType(tag_field_ptr),
5551 LLVMValueRef tag_value = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(tag_field_ptr),
55555552 tag_field_ptr, 0, false, "");
55565553
55575554
......@@ -5787,7 +5784,7 @@ static LLVMValueRef gen_non_null_bit(CodeGen *g, ZigType *maybe_type, LLVMValueR
57875784
57885785 LLVMValueRef maybe_field_ptr = LLVMBuildStructGEP2(g->builder,
57895786 get_llvm_type(g, maybe_type), maybe_handle, maybe_null_index, "");
5790 return gen_load_untyped(g, LLVMGetGEPSourceElementType(maybe_field_ptr), maybe_field_ptr, 0, false, "");
5787 return gen_load_untyped(g, ZigLLVMGetGEPResultElementType(maybe_field_ptr), maybe_field_ptr, 0, false, "");
57915788}
57925789
57935790static LLVMValueRef ir_render_test_non_null(CodeGen *g, Stage1Air *executable,
......@@ -6272,7 +6269,7 @@ static LLVMValueRef ir_render_align_cast(CodeGen *g, Stage1Air *executable, Stag
62726269 LLVMValueRef ptr_val_ptr = LLVMBuildStructGEP2(g->builder,
62736270 get_llvm_type(g, instruction->target->value->type->data.pointer.child_type),
62746271 target_val, (unsigned)ptr_index, "");
6275 ptr_val = gen_load_untyped(g, LLVMGetGEPSourceElementType(ptr_val_ptr), ptr_val_ptr, 0, false, "");
6272 ptr_val = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(ptr_val_ptr), ptr_val_ptr, 0, false, "");
62766273 } else {
62776274 zig_unreachable();
62786275 }
......@@ -6759,7 +6756,7 @@ static LLVMValueRef ir_render_slice(CodeGen *g, Stage1Air *executable, Stage1Air
67596756 if (!instruction->end || want_runtime_safety) {
67606757 LLVMValueRef src_len_ptr = LLVMBuildStructGEP2(g->builder,
67616758 get_llvm_type(g, array_type), array_ptr, gen_len_index, "");
6762 prev_end = gen_load_untyped(g, LLVMGetGEPSourceElementType(src_len_ptr), src_len_ptr, 0, false, "");
6759 prev_end = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(src_len_ptr), src_len_ptr, 0, false, "");
67636760 }
67646761
67656762 LLVMValueRef start_val = ir_llvm_value(g, instruction->start);
......@@ -6804,7 +6801,7 @@ static LLVMValueRef ir_render_slice(CodeGen *g, Stage1Air *executable, Stage1Air
68046801
68056802 LLVMValueRef src_ptr_ptr = LLVMBuildStructGEP2(g->builder,
68066803 get_llvm_type(g, array_type), array_ptr, gen_ptr_index, "");
6807 LLVMValueRef src_ptr = gen_load_untyped(g, LLVMGetGEPSourceElementType(src_ptr_ptr),
6804 LLVMValueRef src_ptr = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(src_ptr_ptr),
68086805 src_ptr_ptr, 0, false, "");
68096806
68106807 if (sentinel != nullptr) {
......@@ -7005,7 +7002,7 @@ static LLVMValueRef ir_render_test_err(CodeGen *g, Stage1Air *executable, Stage1
70057002 if (type_has_bits(g, payload_type)) {
70067003 LLVMValueRef err_val_ptr = LLVMBuildStructGEP2(g->builder,
70077004 get_llvm_type(g, err_union_type), err_union_handle, err_union_err_index, "");
7008 err_val = gen_load_untyped(g, LLVMGetGEPSourceElementType(err_val_ptr), err_val_ptr, 0, false, "");
7005 err_val = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(err_val_ptr), err_val_ptr, 0, false, "");
70097006 } else {
70107007 err_val = err_union_handle;
70117008 }
......@@ -7077,7 +7074,7 @@ static LLVMValueRef ir_render_unwrap_err_payload(CodeGen *g, Stage1Air *executab
70777074 if (type_has_bits(g, payload_type)) {
70787075 LLVMValueRef err_val_ptr = LLVMBuildStructGEP2(g->builder, err_union_llvm_ty,
70797076 err_union_handle, err_union_err_index, "");
7080 err_val = gen_load_untyped(g, LLVMGetGEPSourceElementType(err_val_ptr), err_val_ptr, 0, false, "");
7077 err_val = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(err_val_ptr), err_val_ptr, 0, false, "");
70817078 } else {
70827079 err_val = err_union_handle;
70837080 }
......@@ -7602,7 +7599,7 @@ static LLVMValueRef gen_await_early_return(CodeGen *g, Stage1AirInst *source_ins
76027599 LLVMValueRef their_result_ptr_ptr = LLVMBuildStructGEP2(g->builder,
76037600 target_frame_struct_llvm_ty, target_frame_ptr, frame_ret_start, "");
76047601 their_result_ptr = LLVMBuildLoad2(g->builder,
7605 LLVMGetGEPSourceElementType(their_result_ptr_ptr), their_result_ptr_ptr, "");
7602 ZigLLVMGetGEPResultElementType(their_result_ptr_ptr), their_result_ptr_ptr, "");
76067603 if (result_loc != nullptr) {
76077604 LLVMTypeRef ptr_u8 = LLVMPointerType(LLVMInt8Type(), 0);
76087605 LLVMValueRef dest_ptr_casted = LLVMBuildBitCast(g->builder, result_loc, ptr_u8, "");
......@@ -7620,7 +7617,7 @@ static LLVMValueRef gen_await_early_return(CodeGen *g, Stage1AirInst *source_ins
76207617 target_frame_struct_llvm_ty, target_frame_ptr,
76217618 frame_index_trace_arg(g, result_type), "");
76227619 LLVMValueRef src_trace_ptr = LLVMBuildLoad2(g->builder,
7623 LLVMGetGEPSourceElementType(their_trace_ptr_ptr), their_trace_ptr_ptr, "");
7620 ZigLLVMGetGEPResultElementType(their_trace_ptr_ptr), their_trace_ptr_ptr, "");
76247621 bool is_llvm_alloca;
76257622 LLVMValueRef dest_trace_ptr = get_cur_err_ret_trace_val(g, source_instr->scope, &is_llvm_alloca);
76267623 LLVMValueRef args[] = { dest_trace_ptr, src_trace_ptr };
......@@ -7668,7 +7665,7 @@ static LLVMValueRef ir_render_await(CodeGen *g, Stage1Air *executable, Stage1Air
76687665 target_frame_ptr, frame_ret_start + 1, "");
76697666 if (result_loc == nullptr) {
76707667 // no copy needed
7671 LLVMBuildStore(g->builder, LLVMConstNull(LLVMGetGEPSourceElementType(awaiter_ret_ptr_ptr)),
7668 LLVMBuildStore(g->builder, LLVMConstNull(ZigLLVMGetGEPResultElementType(awaiter_ret_ptr_ptr)),
76727669 awaiter_ret_ptr_ptr);
76737670 } else {
76747671 LLVMBuildStore(g->builder, result_loc, awaiter_ret_ptr_ptr);
......@@ -9353,7 +9350,7 @@ static void do_code_gen(CodeGen *g) {
93539350 ZigType *slice_type = g->stack_trace_type->data.structure.fields[1]->type_entry;
93549351 size_t ptr_field_index = slice_type->data.structure.fields[slice_ptr_index]->gen_index;
93559352 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP2(g->builder,
9356 LLVMGetGEPSourceElementType(addresses_field_ptr),
9353 ZigLLVMGetGEPResultElementType(addresses_field_ptr),
93579354 addresses_field_ptr, (unsigned)ptr_field_index, "");
93589355 LLVMValueRef zero = LLVMConstNull(usize->llvm_type);
93599356 LLVMValueRef indices[] = {zero, zero};
......@@ -9364,7 +9361,7 @@ static void do_code_gen(CodeGen *g) {
93649361
93659362 size_t len_field_index = slice_type->data.structure.fields[slice_len_index]->gen_index;
93669363 LLVMValueRef len_field_ptr = LLVMBuildStructGEP2(g->builder,
9367 LLVMGetGEPSourceElementType(addresses_field_ptr),
9364 ZigLLVMGetGEPResultElementType(addresses_field_ptr),
93689365 addresses_field_ptr, (unsigned)len_field_index, "");
93699366 gen_store(g, LLVMConstInt(usize->llvm_type, stack_trace_ptr_count, false), len_field_ptr, get_pointer_to_type(g, usize, false));
93709367 }
......@@ -9443,7 +9440,7 @@ static void do_code_gen(CodeGen *g) {
94439440 get_llvm_type(g, get_fn_frame_type(g, g->cur_fn)),
94449441 g->cur_frame_ptr,
94459442 frame_index_trace_arg(g, fn_type_id->return_type), "");
9446 LLVMValueRef zero_ptr = LLVMConstNull(LLVMGetGEPSourceElementType(trace_ptr_ptr));
9443 LLVMValueRef zero_ptr = LLVMConstNull(ZigLLVMGetGEPResultElementType(trace_ptr_ptr));
94479444 LLVMBuildStore(g->builder, zero_ptr, trace_ptr_ptr);
94489445 }
94499446
src/zig_llvm.cpp+4
......@@ -1195,6 +1195,10 @@ void ZigLLVMSetCallElemTypeAttr(LLVMValueRef Call, size_t arg_index, LLVMTypeRef
11951195 Attribute::get(call_inst->getContext(), Attribute::ElementType, llvm_type));
11961196}
11971197
1198LLVMTypeRef ZigLLVMGetGEPResultElementType(LLVMValueRef GEP) {
1199 return wrap(unwrap<GEPOperator>(GEP)->getResultElementType());
1200}
1201
11981202void ZigLLVMFunctionSetPrefixData(LLVMValueRef function, LLVMValueRef data) {
11991203 unwrap<Function>(function)->setPrefixData(unwrap<Constant>(data));
12001204}
src/zig_llvm.h+2
......@@ -322,6 +322,8 @@ ZIG_EXTERN_C void ZigLLVMAddSretAttr(LLVMValueRef fn_ref, LLVMTypeRef type_val);
322322ZIG_EXTERN_C void ZigLLVMAddFunctionElemTypeAttr(LLVMValueRef fn_ref, size_t arg_index, LLVMTypeRef elem_ty);
323323ZIG_EXTERN_C void ZigLLVMAddFunctionAttrCold(LLVMValueRef fn);
324324
325ZIG_EXTERN_C LLVMTypeRef ZigLLVMGetGEPResultElementType(LLVMValueRef GEP);
326
325327ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv);
326328
327329