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 {...@@ -4901,7 +4901,7 @@ pub const FuncGen = struct {
4901 if (isByRef(payload_ty)) {4901 if (isByRef(payload_ty)) {
4902 return payload_ptr;4902 return payload_ptr;
4903 }4903 }
4904 const load_inst = fg.builder.buildLoad(payload_ptr.getGEPSourceElementType(), payload_ptr, "");4904 const load_inst = fg.builder.buildLoad(payload_ptr.getGEPResultElementType(), payload_ptr, "");
4905 load_inst.setAlignment(payload_ty.abiAlignment(target));4905 load_inst.setAlignment(payload_ty.abiAlignment(target));
4906 return load_inst;4906 return load_inst;
4907 }4907 }
...@@ -6043,7 +6043,7 @@ pub const FuncGen = struct {...@@ -6043,7 +6043,7 @@ pub const FuncGen = struct {
6043 if (isByRef(payload_ty)) {6043 if (isByRef(payload_ty)) {
6044 return payload_ptr;6044 return payload_ptr;
6045 }6045 }
6046 const load_inst = self.builder.buildLoad(payload_ptr.getGEPSourceElementType(), payload_ptr, "");6046 const load_inst = self.builder.buildLoad(payload_ptr.getGEPResultElementType(), payload_ptr, "");
6047 load_inst.setAlignment(payload_ty.abiAlignment(target));6047 load_inst.setAlignment(payload_ty.abiAlignment(target));
6048 return load_inst;6048 return load_inst;
6049 }6049 }
...@@ -7820,7 +7820,7 @@ pub const FuncGen = struct {...@@ -7820,7 +7820,7 @@ pub const FuncGen = struct {
7820 }7820 }
7821 const tag_index = @boolToInt(layout.tag_align < layout.payload_align);7821 const tag_index = @boolToInt(layout.tag_align < layout.payload_align);
7822 const tag_field_ptr = self.builder.buildStructGEP(llvm_un_ty, union_handle, tag_index, "");7822 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, "");
7824 } else {7824 } else {
7825 if (layout.payload_size == 0) {7825 if (layout.payload_size == 0) {
7826 return union_handle;7826 return union_handle;
...@@ -8671,7 +8671,7 @@ pub const FuncGen = struct {...@@ -8671,7 +8671,7 @@ pub const FuncGen = struct {
8671 }8671 }
8672 const target = fg.dg.module.getTarget();8672 const target = fg.dg.module.getTarget();
8673 const payload_alignment = payload_ty.abiAlignment(target);8673 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, "");
8675 load_inst.setAlignment(payload_alignment);8675 load_inst.setAlignment(payload_alignment);
8676 return load_inst;8676 return load_inst;
8677 }8677 }
src/codegen/llvm/bindings.zig+2-2
...@@ -242,8 +242,8 @@ pub const Value = opaque {...@@ -242,8 +242,8 @@ pub const Value = opaque {
242 pub const addFunctionAttr = ZigLLVMAddFunctionAttr;242 pub const addFunctionAttr = ZigLLVMAddFunctionAttr;
243 extern fn ZigLLVMAddFunctionAttr(Fn: *const Value, attr_name: [*:0]const u8, attr_value: [*:0]const u8) void;243 extern fn ZigLLVMAddFunctionAttr(Fn: *const Value, attr_name: [*:0]const u8, attr_value: [*:0]const u8) void;
244244
245 pub const getGEPSourceElementType = LLVMGetGEPSourceElementType;245 pub const getGEPResultElementType = ZigLLVMGetGEPResultElementType;
246 extern fn LLVMGetGEPSourceElementType(GEP: *const Value) *const Type;246 extern fn ZigLLVMGetGEPResultElementType(GEP: *const Value) *const Type;
247};247};
248248
249pub const Type = opaque {249pub const Type = opaque {
src/stage1/codegen.cpp+40-43
...@@ -1276,16 +1276,16 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) {...@@ -1276,16 +1276,16 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) {
1276 ZigType *slice_type = g->stack_trace_type->data.structure.fields[1]->type_entry;1276 ZigType *slice_type = g->stack_trace_type->data.structure.fields[1]->type_entry;
1277 size_t ptr_field_index = slice_type->data.structure.fields[slice_ptr_index]->gen_index;1277 size_t ptr_field_index = slice_type->data.structure.fields[slice_ptr_index]->gen_index;
1278 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP2(g->builder,1278 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP2(g->builder,
1279 LLVMGetGEPSourceElementType(addresses_field_ptr),1279 ZigLLVMGetGEPResultElementType(addresses_field_ptr),
1280 addresses_field_ptr, (unsigned)ptr_field_index, "");1280 addresses_field_ptr, (unsigned)ptr_field_index, "");
1281 size_t len_field_index = slice_type->data.structure.fields[slice_len_index]->gen_index;1281 size_t len_field_index = slice_type->data.structure.fields[slice_len_index]->gen_index;
1282 LLVMValueRef len_field_ptr = LLVMBuildStructGEP2(g->builder,1282 LLVMValueRef len_field_ptr = LLVMBuildStructGEP2(g->builder,
1283 LLVMGetGEPSourceElementType(addresses_field_ptr),1283 ZigLLVMGetGEPResultElementType(addresses_field_ptr),
1284 addresses_field_ptr, (unsigned)len_field_index, "");1284 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),
1287 len_field_ptr, 0, false, "");1287 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),
1289 index_field_ptr, 0, false, "");1289 index_field_ptr, 0, false, "");
1290 LLVMValueRef len_val_minus_one = LLVMBuildSub(g->builder, len_value, LLVMConstInt(usize_type_ref, 1, false), "");1290 LLVMValueRef len_val_minus_one = LLVMBuildSub(g->builder, len_value, LLVMConstInt(usize_type_ref, 1, false), "");
1291 LLVMValueRef masked_val = LLVMBuildAnd(g->builder, index_val, len_val_minus_one, "");1291 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) {...@@ -1293,7 +1293,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) {
1293 masked_val,1293 masked_val,
1294 };1294 };
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),
1297 ptr_field_ptr, 0, false, "");1297 ptr_field_ptr, 0, false, "");
1298 LLVMValueRef address_slot = LLVMBuildInBoundsGEP2(g->builder, usize_type_ref, ptr_value, address_indices, 1, "");1298 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) {...@@ -1455,22 +1455,19 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {
1455 }1455 }
14561456
1457 // Fetch the error name from the global table1457 // Fetch the error name from the global table
1458 LLVMValueRef err_table_indices[] = {1458 LLVMValueRef err_table_indices[] = { err_val };
1459 LLVMConstNull(usize_ty->llvm_type),
1460 err_val,
1461 };
1462 LLVMValueRef err_name_val = LLVMBuildInBoundsGEP2(g->builder,1459 LLVMValueRef err_name_val = LLVMBuildInBoundsGEP2(g->builder,
1463 get_llvm_type(g, str_type),1460 get_llvm_type(g, str_type),
1464 g->err_name_table, err_table_indices, 2, "");1461 g->err_name_table, err_table_indices, 2, "");
14651462
1466 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP2(g->builder,1463 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP2(g->builder,
1467 LLVMGetGEPSourceElementType(err_name_val), err_name_val, slice_ptr_index, "");1464 ZigLLVMGetGEPResultElementType(err_name_val), err_name_val, slice_ptr_index, "");
1468 LLVMValueRef err_name_ptr = gen_load_untyped(g, LLVMGetGEPSourceElementType(ptr_field_ptr),1465 LLVMValueRef err_name_ptr = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(ptr_field_ptr),
1469 ptr_field_ptr, 0, false, "");1466 ptr_field_ptr, 0, false, "");
14701467
1471 LLVMValueRef len_field_ptr = LLVMBuildStructGEP2(g->builder,1468 LLVMValueRef len_field_ptr = LLVMBuildStructGEP2(g->builder,
1472 LLVMGetGEPSourceElementType(err_name_val), err_name_val, slice_len_index, "");1469 ZigLLVMGetGEPResultElementType(err_name_val), err_name_val, slice_len_index, "");
1473 LLVMValueRef err_name_len = gen_load_untyped(g, LLVMGetGEPSourceElementType(len_field_ptr),1470 LLVMValueRef err_name_len = gen_load_untyped(g, ZigLLVMGetGEPResultElementType(len_field_ptr),
1474 len_field_ptr, 0, false, "");1471 len_field_ptr, 0, false, "");
14751472
1476 LLVMValueRef msg_prefix_len = LLVMConstInt(usize_ty->llvm_type, strlen(unwrap_err_msg_text), false);1473 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_...@@ -2374,7 +2371,7 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_
2374 LLVMValueRef adjusted_ptr_to_struct = LLVMBuildStructGEP2(g->builder,2371 LLVMValueRef adjusted_ptr_to_struct = LLVMBuildStructGEP2(g->builder,
2375 abi_type, val, i, "");2372 abi_type, val, i, "");
2376 LLVMValueRef loaded = LLVMBuildLoad2(g->builder,2373 LLVMValueRef loaded = LLVMBuildLoad2(g->builder,
2377 LLVMGetGEPSourceElementType(adjusted_ptr_to_struct),2374 ZigLLVMGetGEPResultElementType(adjusted_ptr_to_struct),
2378 adjusted_ptr_to_struct, "");2375 adjusted_ptr_to_struct, "");
2379 fn_walk->data.call.gen_param_values->append(loaded);2376 fn_walk->data.call.gen_param_values->append(loaded);
2380 }2377 }
...@@ -2621,18 +2618,18 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) {...@@ -2621,18 +2618,18 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) {
2621 ZigType *slice_type = g->stack_trace_type->data.structure.fields[1]->type_entry;2618 ZigType *slice_type = g->stack_trace_type->data.structure.fields[1]->type_entry;
2622 size_t ptr_field_index = slice_type->data.structure.fields[slice_ptr_index]->gen_index;2619 size_t ptr_field_index = slice_type->data.structure.fields[slice_ptr_index]->gen_index;
2623 LLVMValueRef src_ptr_field_ptr = LLVMBuildStructGEP2(g->builder,2620 LLVMValueRef src_ptr_field_ptr = LLVMBuildStructGEP2(g->builder,
2624 LLVMGetGEPSourceElementType(src_addresses_field_ptr),2621 ZigLLVMGetGEPResultElementType(src_addresses_field_ptr),
2625 src_addresses_field_ptr, (unsigned)ptr_field_index, "");2622 src_addresses_field_ptr, (unsigned)ptr_field_index, "");
2626 size_t len_field_index = slice_type->data.structure.fields[slice_len_index]->gen_index;2623 size_t len_field_index = slice_type->data.structure.fields[slice_len_index]->gen_index;
2627 LLVMValueRef src_len_field_ptr = LLVMBuildStructGEP2(g->builder,2624 LLVMValueRef src_len_field_ptr = LLVMBuildStructGEP2(g->builder,
2628 LLVMGetGEPSourceElementType(src_addresses_field_ptr),2625 ZigLLVMGetGEPResultElementType(src_addresses_field_ptr),
2629 src_addresses_field_ptr, (unsigned)len_field_index, "");2626 src_addresses_field_ptr, (unsigned)len_field_index, "");
2630 LLVMValueRef src_index_val = LLVMBuildLoad2(g->builder,2627 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, "");
2632 LLVMValueRef src_ptr_val = LLVMBuildLoad2(g->builder,2629 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, "");
2634 LLVMValueRef src_len_val = LLVMBuildLoad2(g->builder,2631 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, "");
2636 LLVMValueRef no_wrap_bit = LLVMBuildICmp(g->builder, LLVMIntULT, src_index_val, src_len_val, "");2633 LLVMValueRef no_wrap_bit = LLVMBuildICmp(g->builder, LLVMIntULT, src_index_val, src_len_val, "");
2637 LLVMBasicBlockRef no_wrap_block = LLVMAppendBasicBlock(fn_val, "NoWrap");2634 LLVMBasicBlockRef no_wrap_block = LLVMAppendBasicBlock(fn_val, "NoWrap");
2638 LLVMBasicBlockRef yes_wrap_block = LLVMAppendBasicBlock(fn_val, "YesWrap");2635 LLVMBasicBlockRef yes_wrap_block = LLVMAppendBasicBlock(fn_val, "YesWrap");
...@@ -2658,7 +2655,7 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) {...@@ -2658,7 +2655,7 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) {
2658 LLVMValueRef ptr_index = LLVMBuildLoad2(g->builder, usize_type_ref, frame_index_ptr, "");2655 LLVMValueRef ptr_index = LLVMBuildLoad2(g->builder, usize_type_ref, frame_index_ptr, "");
2659 LLVMValueRef addr_ptr = LLVMBuildInBoundsGEP2(g->builder,2656 LLVMValueRef addr_ptr = LLVMBuildInBoundsGEP2(g->builder,
2660 usize_type_ref, src_ptr_val, &ptr_index, 1, "");2657 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),
2662 addr_ptr, "");2659 addr_ptr, "");
2663 LLVMValueRef args[] = {dest_stack_trace_ptr, this_addr_val};2660 LLVMValueRef args[] = {dest_stack_trace_ptr, this_addr_val};
2664 ZigLLVMBuildCall(g->builder, LLVMGlobalGetValueType(add_error_return_trace_addr_fn_val),2661 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...@@ -4793,7 +4790,7 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, Stage1Air *executable, Stage1
4793 assert(len_index != SIZE_MAX);4790 assert(len_index != SIZE_MAX);
4794 LLVMValueRef len_ptr = LLVMBuildStructGEP2(g->builder, get_llvm_type(g, array_type),4791 LLVMValueRef len_ptr = LLVMBuildStructGEP2(g->builder, get_llvm_type(g, array_type),
4795 array_ptr, (unsigned)len_index, "");4792 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,
4797 0, false, "");4794 0, false, "");
4798 LLVMIntPredicate upper_op = (ptr_type->data.pointer.sentinel != nullptr) ? LLVMIntULE : LLVMIntULT;4795 LLVMIntPredicate upper_op = (ptr_type->data.pointer.sentinel != nullptr) ? LLVMIntULE : LLVMIntULT;
4799 add_bounds_check(g, subscript_value, LLVMIntEQ, nullptr, upper_op, len);4796 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...@@ -4803,7 +4800,7 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, Stage1Air *executable, Stage1
4803 assert(ptr_index != SIZE_MAX);4800 assert(ptr_index != SIZE_MAX);
4804 LLVMValueRef ptr_ptr = LLVMBuildStructGEP2(g->builder, get_llvm_type(g, array_type),4801 LLVMValueRef ptr_ptr = LLVMBuildStructGEP2(g->builder, get_llvm_type(g, array_type),
4805 array_ptr, (unsigned)ptr_index, "");4802 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,
4807 false, "");4804 false, "");
4808 LLVMTypeRef elem_llvm_ty = get_llvm_type(g, ptr_type->data.pointer.child_type);4805 LLVMTypeRef elem_llvm_ty = get_llvm_type(g, ptr_type->data.pointer.child_type);
4809 return LLVMBuildInBoundsGEP2(g->builder, elem_llvm_ty, ptr, &subscript_value, 1, "");4806 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...@@ -4820,9 +4817,9 @@ static LLVMValueRef get_new_stack_addr(CodeGen *g, LLVMTypeRef new_stack_llvm_ty
4820 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP2(g->builder, new_stack_llvm_ty, new_stack, (unsigned)slice_ptr_index, "");4817 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP2(g->builder, new_stack_llvm_ty, new_stack, (unsigned)slice_ptr_index, "");
4821 LLVMValueRef len_field_ptr = LLVMBuildStructGEP2(g->builder, new_stack_llvm_ty, new_stack, (unsigned)slice_len_index, "");4818 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),
4824 ptr_field_ptr, 0, false, "");4821 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),
4826 len_field_ptr, 0, false, "");4823 len_field_ptr, 0, false, "");
48274824
4828 LLVMValueRef ptr_addr = LLVMBuildPtrToInt(g->builder, ptr_value, LLVMTypeOf(len_value), "");4825 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...@@ -4962,7 +4959,7 @@ static void gen_init_stack_trace(CodeGen *g, LLVMValueRef trace_field_ptr, LLVMV
49624959
4963 LLVMValueRef addrs_slice_ptr = LLVMBuildStructGEP2(g->builder, stack_trace_llvm_ty, trace_field_ptr, 1, "");4960 LLVMValueRef addrs_slice_ptr = LLVMBuildStructGEP2(g->builder, stack_trace_llvm_ty, trace_field_ptr, 1, "");
4964 LLVMValueRef addrs_ptr_ptr = LLVMBuildStructGEP2(g->builder,4961 LLVMValueRef addrs_ptr_ptr = LLVMBuildStructGEP2(g->builder,
4965 LLVMGetGEPSourceElementType(addrs_slice_ptr),4962 ZigLLVMGetGEPResultElementType(addrs_slice_ptr),
4966 addrs_slice_ptr, slice_ptr_index, "");4963 addrs_slice_ptr, slice_ptr_index, "");
4967 LLVMValueRef indices[] = { LLVMConstNull(usize_type_ref), LLVMConstNull(usize_type_ref) };4964 LLVMValueRef indices[] = { LLVMConstNull(usize_type_ref), LLVMConstNull(usize_type_ref) };
4968 LLVMValueRef trace_field_addrs_as_ptr = LLVMBuildInBoundsGEP2(g->builder,4965 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...@@ -4970,7 +4967,7 @@ static void gen_init_stack_trace(CodeGen *g, LLVMValueRef trace_field_ptr, LLVMV
4970 LLVMBuildStore(g->builder, trace_field_addrs_as_ptr, addrs_ptr_ptr);4967 LLVMBuildStore(g->builder, trace_field_addrs_as_ptr, addrs_ptr_ptr);
49714968
4972 LLVMValueRef addrs_len_ptr = LLVMBuildStructGEP2(g->builder,4969 LLVMValueRef addrs_len_ptr = LLVMBuildStructGEP2(g->builder,
4973 LLVMGetGEPSourceElementType(addrs_slice_ptr),4970 ZigLLVMGetGEPResultElementType(addrs_slice_ptr),
4974 addrs_slice_ptr, slice_len_index, "");4971 addrs_slice_ptr, slice_len_index, "");
4975 LLVMBuildStore(g->builder, LLVMConstInt(usize_type_ref, stack_trace_ptr_count, false), addrs_len_ptr);4972 LLVMBuildStore(g->builder, LLVMConstInt(usize_type_ref, stack_trace_ptr_count, false), addrs_len_ptr);
4976}4973}
...@@ -5064,7 +5061,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI...@@ -5064,7 +5061,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
5064 LLVMValueRef frame_ptr_ptr = LLVMBuildStructGEP2(g->builder, frame_slice_llvm_ty,5061 LLVMValueRef frame_ptr_ptr = LLVMBuildStructGEP2(g->builder, frame_slice_llvm_ty,
5065 frame_slice_ptr, slice_ptr_index, "");5062 frame_slice_ptr, slice_ptr_index, "");
5066 LLVMValueRef frame_ptr = LLVMBuildLoad2(g->builder,5063 LLVMValueRef frame_ptr = LLVMBuildLoad2(g->builder,
5067 LLVMGetGEPSourceElementType(frame_ptr_ptr), frame_ptr_ptr, "");5064 ZigLLVMGetGEPResultElementType(frame_ptr_ptr), frame_ptr_ptr, "");
5068 if (instruction->fn_entry == nullptr) {5065 if (instruction->fn_entry == nullptr) {
5069 anyframe_type = get_any_frame_type(g, src_return_type);5066 anyframe_type = get_any_frame_type(g, src_return_type);
5070 frame_result_loc = LLVMBuildBitCast(g->builder, frame_ptr, get_llvm_type(g, anyframe_type), "");5067 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...@@ -5127,7 +5124,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
51275124
5128 // Store a zero in the awaiter's result ptr to indicate we do not need a copy made.5125 // Store a zero in the awaiter's result ptr to indicate we do not need a copy made.
5129 LLVMValueRef awaiter_ret_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty, frame_result_loc, frame_ret_start + 1, "");5126 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));
5131 LLVMBuildStore(g->builder, zero_ptr, awaiter_ret_ptr);5128 LLVMBuildStore(g->builder, zero_ptr, awaiter_ret_ptr);
5132 }5129 }
51335130
...@@ -5145,7 +5142,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI...@@ -5145,7 +5142,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
51455142
5146 LLVMValueRef fn_ptr_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty, frame_result_loc, frame_fn_ptr_index, "");5143 LLVMValueRef fn_ptr_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty, frame_result_loc, frame_fn_ptr_index, "");
5147 LLVMValueRef bitcasted_fn_val = LLVMBuildBitCast(g->builder, fn_val,5144 LLVMValueRef bitcasted_fn_val = LLVMBuildBitCast(g->builder, fn_val,
5148 LLVMGetGEPSourceElementType(fn_ptr_ptr), "");5145 ZigLLVMGetGEPResultElementType(fn_ptr_ptr), "");
5149 LLVMBuildStore(g->builder, bitcasted_fn_val, fn_ptr_ptr);5146 LLVMBuildStore(g->builder, bitcasted_fn_val, fn_ptr_ptr);
51505147
5151 LLVMValueRef resume_index_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty, frame_result_loc, frame_resume_index, "");5148 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...@@ -5362,7 +5359,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
5362 get_llvm_type(g, instruction->new_stack->value->type->data.pointer.child_type),5359 get_llvm_type(g, instruction->new_stack->value->type->data.pointer.child_type),
5363 frame_slice_ptr, slice_ptr_index, "");5360 frame_slice_ptr, slice_ptr_index, "");
5364 frame_result_loc_uncasted = LLVMBuildLoad2(g->builder,5361 frame_result_loc_uncasted = LLVMBuildLoad2(g->builder,
5365 LLVMGetGEPSourceElementType(frame_ptr_ptr), frame_ptr_ptr, "");5362 ZigLLVMGetGEPResultElementType(frame_ptr_ptr), frame_ptr_ptr, "");
5366 }5363 }
5367 if (frame_result_loc_uncasted != nullptr) {5364 if (frame_result_loc_uncasted != nullptr) {
5368 if (instruction->fn_entry != nullptr) {5365 if (instruction->fn_entry != nullptr) {
...@@ -5551,7 +5548,7 @@ static LLVMValueRef ir_render_union_field_ptr(CodeGen *g, Stage1Air *executable,...@@ -5551,7 +5548,7 @@ static LLVMValueRef ir_render_union_field_ptr(CodeGen *g, Stage1Air *executable,
5551 LLVMValueRef tag_field_ptr = LLVMBuildStructGEP2(g->builder,5548 LLVMValueRef tag_field_ptr = LLVMBuildStructGEP2(g->builder,
5552 get_llvm_type(g, union_type),5549 get_llvm_type(g, union_type),
5553 union_ptr, union_type->data.unionation.gen_tag_index, "");5550 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),
5555 tag_field_ptr, 0, false, "");5552 tag_field_ptr, 0, false, "");
55565553
55575554
...@@ -5787,7 +5784,7 @@ static LLVMValueRef gen_non_null_bit(CodeGen *g, ZigType *maybe_type, LLVMValueR...@@ -5787,7 +5784,7 @@ static LLVMValueRef gen_non_null_bit(CodeGen *g, ZigType *maybe_type, LLVMValueR
57875784
5788 LLVMValueRef maybe_field_ptr = LLVMBuildStructGEP2(g->builder,5785 LLVMValueRef maybe_field_ptr = LLVMBuildStructGEP2(g->builder,
5789 get_llvm_type(g, maybe_type), maybe_handle, maybe_null_index, "");5786 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, "");
5791}5788}
57925789
5793static LLVMValueRef ir_render_test_non_null(CodeGen *g, Stage1Air *executable,5790static 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...@@ -6272,7 +6269,7 @@ static LLVMValueRef ir_render_align_cast(CodeGen *g, Stage1Air *executable, Stag
6272 LLVMValueRef ptr_val_ptr = LLVMBuildStructGEP2(g->builder,6269 LLVMValueRef ptr_val_ptr = LLVMBuildStructGEP2(g->builder,
6273 get_llvm_type(g, instruction->target->value->type->data.pointer.child_type),6270 get_llvm_type(g, instruction->target->value->type->data.pointer.child_type),
6274 target_val, (unsigned)ptr_index, "");6271 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, "");
6276 } else {6273 } else {
6277 zig_unreachable();6274 zig_unreachable();
6278 }6275 }
...@@ -6759,7 +6756,7 @@ static LLVMValueRef ir_render_slice(CodeGen *g, Stage1Air *executable, Stage1Air...@@ -6759,7 +6756,7 @@ static LLVMValueRef ir_render_slice(CodeGen *g, Stage1Air *executable, Stage1Air
6759 if (!instruction->end || want_runtime_safety) {6756 if (!instruction->end || want_runtime_safety) {
6760 LLVMValueRef src_len_ptr = LLVMBuildStructGEP2(g->builder,6757 LLVMValueRef src_len_ptr = LLVMBuildStructGEP2(g->builder,
6761 get_llvm_type(g, array_type), array_ptr, gen_len_index, "");6758 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, "");
6763 }6760 }
67646761
6765 LLVMValueRef start_val = ir_llvm_value(g, instruction->start);6762 LLVMValueRef start_val = ir_llvm_value(g, instruction->start);
...@@ -6804,7 +6801,7 @@ static LLVMValueRef ir_render_slice(CodeGen *g, Stage1Air *executable, Stage1Air...@@ -6804,7 +6801,7 @@ static LLVMValueRef ir_render_slice(CodeGen *g, Stage1Air *executable, Stage1Air
68046801
6805 LLVMValueRef src_ptr_ptr = LLVMBuildStructGEP2(g->builder,6802 LLVMValueRef src_ptr_ptr = LLVMBuildStructGEP2(g->builder,
6806 get_llvm_type(g, array_type), array_ptr, gen_ptr_index, "");6803 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),
6808 src_ptr_ptr, 0, false, "");6805 src_ptr_ptr, 0, false, "");
68096806
6810 if (sentinel != nullptr) {6807 if (sentinel != nullptr) {
...@@ -7005,7 +7002,7 @@ static LLVMValueRef ir_render_test_err(CodeGen *g, Stage1Air *executable, Stage1...@@ -7005,7 +7002,7 @@ static LLVMValueRef ir_render_test_err(CodeGen *g, Stage1Air *executable, Stage1
7005 if (type_has_bits(g, payload_type)) {7002 if (type_has_bits(g, payload_type)) {
7006 LLVMValueRef err_val_ptr = LLVMBuildStructGEP2(g->builder,7003 LLVMValueRef err_val_ptr = LLVMBuildStructGEP2(g->builder,
7007 get_llvm_type(g, err_union_type), err_union_handle, err_union_err_index, "");7004 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, "");
7009 } else {7006 } else {
7010 err_val = err_union_handle;7007 err_val = err_union_handle;
7011 }7008 }
...@@ -7077,7 +7074,7 @@ static LLVMValueRef ir_render_unwrap_err_payload(CodeGen *g, Stage1Air *executab...@@ -7077,7 +7074,7 @@ static LLVMValueRef ir_render_unwrap_err_payload(CodeGen *g, Stage1Air *executab
7077 if (type_has_bits(g, payload_type)) {7074 if (type_has_bits(g, payload_type)) {
7078 LLVMValueRef err_val_ptr = LLVMBuildStructGEP2(g->builder, err_union_llvm_ty,7075 LLVMValueRef err_val_ptr = LLVMBuildStructGEP2(g->builder, err_union_llvm_ty,
7079 err_union_handle, err_union_err_index, "");7076 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, "");
7081 } else {7078 } else {
7082 err_val = err_union_handle;7079 err_val = err_union_handle;
7083 }7080 }
...@@ -7602,7 +7599,7 @@ static LLVMValueRef gen_await_early_return(CodeGen *g, Stage1AirInst *source_ins...@@ -7602,7 +7599,7 @@ static LLVMValueRef gen_await_early_return(CodeGen *g, Stage1AirInst *source_ins
7602 LLVMValueRef their_result_ptr_ptr = LLVMBuildStructGEP2(g->builder,7599 LLVMValueRef their_result_ptr_ptr = LLVMBuildStructGEP2(g->builder,
7603 target_frame_struct_llvm_ty, target_frame_ptr, frame_ret_start, "");7600 target_frame_struct_llvm_ty, target_frame_ptr, frame_ret_start, "");
7604 their_result_ptr = LLVMBuildLoad2(g->builder,7601 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, "");
7606 if (result_loc != nullptr) {7603 if (result_loc != nullptr) {
7607 LLVMTypeRef ptr_u8 = LLVMPointerType(LLVMInt8Type(), 0);7604 LLVMTypeRef ptr_u8 = LLVMPointerType(LLVMInt8Type(), 0);
7608 LLVMValueRef dest_ptr_casted = LLVMBuildBitCast(g->builder, result_loc, ptr_u8, "");7605 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...@@ -7620,7 +7617,7 @@ static LLVMValueRef gen_await_early_return(CodeGen *g, Stage1AirInst *source_ins
7620 target_frame_struct_llvm_ty, target_frame_ptr,7617 target_frame_struct_llvm_ty, target_frame_ptr,
7621 frame_index_trace_arg(g, result_type), "");7618 frame_index_trace_arg(g, result_type), "");
7622 LLVMValueRef src_trace_ptr = LLVMBuildLoad2(g->builder,7619 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, "");
7624 bool is_llvm_alloca;7621 bool is_llvm_alloca;
7625 LLVMValueRef dest_trace_ptr = get_cur_err_ret_trace_val(g, source_instr->scope, &is_llvm_alloca);7622 LLVMValueRef dest_trace_ptr = get_cur_err_ret_trace_val(g, source_instr->scope, &is_llvm_alloca);
7626 LLVMValueRef args[] = { dest_trace_ptr, src_trace_ptr };7623 LLVMValueRef args[] = { dest_trace_ptr, src_trace_ptr };
...@@ -7668,7 +7665,7 @@ static LLVMValueRef ir_render_await(CodeGen *g, Stage1Air *executable, Stage1Air...@@ -7668,7 +7665,7 @@ static LLVMValueRef ir_render_await(CodeGen *g, Stage1Air *executable, Stage1Air
7668 target_frame_ptr, frame_ret_start + 1, "");7665 target_frame_ptr, frame_ret_start + 1, "");
7669 if (result_loc == nullptr) {7666 if (result_loc == nullptr) {
7670 // no copy needed7667 // no copy needed
7671 LLVMBuildStore(g->builder, LLVMConstNull(LLVMGetGEPSourceElementType(awaiter_ret_ptr_ptr)),7668 LLVMBuildStore(g->builder, LLVMConstNull(ZigLLVMGetGEPResultElementType(awaiter_ret_ptr_ptr)),
7672 awaiter_ret_ptr_ptr);7669 awaiter_ret_ptr_ptr);
7673 } else {7670 } else {
7674 LLVMBuildStore(g->builder, result_loc, awaiter_ret_ptr_ptr);7671 LLVMBuildStore(g->builder, result_loc, awaiter_ret_ptr_ptr);
...@@ -9353,7 +9350,7 @@ static void do_code_gen(CodeGen *g) {...@@ -9353,7 +9350,7 @@ static void do_code_gen(CodeGen *g) {
9353 ZigType *slice_type = g->stack_trace_type->data.structure.fields[1]->type_entry;9350 ZigType *slice_type = g->stack_trace_type->data.structure.fields[1]->type_entry;
9354 size_t ptr_field_index = slice_type->data.structure.fields[slice_ptr_index]->gen_index;9351 size_t ptr_field_index = slice_type->data.structure.fields[slice_ptr_index]->gen_index;
9355 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP2(g->builder,9352 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP2(g->builder,
9356 LLVMGetGEPSourceElementType(addresses_field_ptr),9353 ZigLLVMGetGEPResultElementType(addresses_field_ptr),
9357 addresses_field_ptr, (unsigned)ptr_field_index, "");9354 addresses_field_ptr, (unsigned)ptr_field_index, "");
9358 LLVMValueRef zero = LLVMConstNull(usize->llvm_type);9355 LLVMValueRef zero = LLVMConstNull(usize->llvm_type);
9359 LLVMValueRef indices[] = {zero, zero};9356 LLVMValueRef indices[] = {zero, zero};
...@@ -9364,7 +9361,7 @@ static void do_code_gen(CodeGen *g) {...@@ -9364,7 +9361,7 @@ static void do_code_gen(CodeGen *g) {
93649361
9365 size_t len_field_index = slice_type->data.structure.fields[slice_len_index]->gen_index;9362 size_t len_field_index = slice_type->data.structure.fields[slice_len_index]->gen_index;
9366 LLVMValueRef len_field_ptr = LLVMBuildStructGEP2(g->builder,9363 LLVMValueRef len_field_ptr = LLVMBuildStructGEP2(g->builder,
9367 LLVMGetGEPSourceElementType(addresses_field_ptr),9364 ZigLLVMGetGEPResultElementType(addresses_field_ptr),
9368 addresses_field_ptr, (unsigned)len_field_index, "");9365 addresses_field_ptr, (unsigned)len_field_index, "");
9369 gen_store(g, LLVMConstInt(usize->llvm_type, stack_trace_ptr_count, false), len_field_ptr, get_pointer_to_type(g, usize, false));9366 gen_store(g, LLVMConstInt(usize->llvm_type, stack_trace_ptr_count, false), len_field_ptr, get_pointer_to_type(g, usize, false));
9370 }9367 }
...@@ -9443,7 +9440,7 @@ static void do_code_gen(CodeGen *g) {...@@ -9443,7 +9440,7 @@ static void do_code_gen(CodeGen *g) {
9443 get_llvm_type(g, get_fn_frame_type(g, g->cur_fn)),9440 get_llvm_type(g, get_fn_frame_type(g, g->cur_fn)),
9444 g->cur_frame_ptr,9441 g->cur_frame_ptr,
9445 frame_index_trace_arg(g, fn_type_id->return_type), "");9442 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));
9447 LLVMBuildStore(g->builder, zero_ptr, trace_ptr_ptr);9444 LLVMBuildStore(g->builder, zero_ptr, trace_ptr_ptr);
9448 }9445 }
94499446
src/zig_llvm.cpp+4
...@@ -1195,6 +1195,10 @@ void ZigLLVMSetCallElemTypeAttr(LLVMValueRef Call, size_t arg_index, LLVMTypeRef...@@ -1195,6 +1195,10 @@ void ZigLLVMSetCallElemTypeAttr(LLVMValueRef Call, size_t arg_index, LLVMTypeRef
1195 Attribute::get(call_inst->getContext(), Attribute::ElementType, llvm_type));1195 Attribute::get(call_inst->getContext(), Attribute::ElementType, llvm_type));
1196}1196}
11971197
1198LLVMTypeRef ZigLLVMGetGEPResultElementType(LLVMValueRef GEP) {
1199 return wrap(unwrap<GEPOperator>(GEP)->getResultElementType());
1200}
1201
1198void ZigLLVMFunctionSetPrefixData(LLVMValueRef function, LLVMValueRef data) {1202void ZigLLVMFunctionSetPrefixData(LLVMValueRef function, LLVMValueRef data) {
1199 unwrap<Function>(function)->setPrefixData(unwrap<Constant>(data));1203 unwrap<Function>(function)->setPrefixData(unwrap<Constant>(data));
1200}1204}
src/zig_llvm.h+2
...@@ -322,6 +322,8 @@ ZIG_EXTERN_C void ZigLLVMAddSretAttr(LLVMValueRef fn_ref, LLVMTypeRef type_val);...@@ -322,6 +322,8 @@ ZIG_EXTERN_C void ZigLLVMAddSretAttr(LLVMValueRef fn_ref, LLVMTypeRef type_val);
322ZIG_EXTERN_C void ZigLLVMAddFunctionElemTypeAttr(LLVMValueRef fn_ref, size_t arg_index, LLVMTypeRef elem_ty);322ZIG_EXTERN_C void ZigLLVMAddFunctionElemTypeAttr(LLVMValueRef fn_ref, size_t arg_index, LLVMTypeRef elem_ty);
323ZIG_EXTERN_C void ZigLLVMAddFunctionAttrCold(LLVMValueRef fn);323ZIG_EXTERN_C void ZigLLVMAddFunctionAttrCold(LLVMValueRef fn);
324324
325ZIG_EXTERN_C LLVMTypeRef ZigLLVMGetGEPResultElementType(LLVMValueRef GEP);
326
325ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv);327ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv);
326328
327329