authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-08-03 14:48:08-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-08-03 14:48:08-07:00
log7e43904508a5cce3a4774de7f68983fe4d4bf5ab
treec5b7fb846f8bd37383aad1ef023abab3d9f902e3
parent900f969cb3f441d8316eb001e0332f53efdabc1c

stage1: more LLVM15 opaque pointers fixes


3 files changed, 28 insertions(+), 25 deletions(-)

src/stage1/all_types.hpp+1
......@@ -1594,6 +1594,7 @@ struct ZigTypeFnFrame {
15941594
15951595struct ZigTypeAnyFrame {
15961596 ZigType *result_type; // null if `anyframe` instead of `anyframe->T`
1597 LLVMTypeRef struct_llvm_ty;
15971598};
15981599
15991600struct ZigType {
src/stage1/analyze.cpp+3-2
......@@ -9746,8 +9746,8 @@ static void resolve_llvm_types_any_frame(CodeGen *g, ZigType *any_frame_type, Re
97469746
97479747 Buf *name = buf_sprintf("(%s header)", buf_ptr(&any_frame_type->name));
97489748 LLVMTypeRef frame_header_type = LLVMStructCreateNamed(LLVMGetGlobalContext(), buf_ptr(name));
9749 g->any_frame_header_llvm_ty = frame_header_type;
97509749 any_frame_type->llvm_type = LLVMPointerType(frame_header_type, 0);
9750 any_frame_type->data.any_frame.struct_llvm_ty = frame_header_type;
97519751
97529752 unsigned dwarf_kind = ZigLLVMTag_DW_structure_type();
97539753 ZigLLVMDIFile *di_file = nullptr;
......@@ -9770,7 +9770,8 @@ static void resolve_llvm_types_any_frame(CodeGen *g, ZigType *any_frame_type, Re
97709770 const unsigned fn_addrspace = ZigLLVMDataLayoutGetProgramAddressSpace(g->target_data_ref);
97719771 LLVMTypeRef ptr_fn_llvm_type = LLVMPointerType(fn_type, fn_addrspace);
97729772 if (result_type == nullptr) {
9773 g->anyframe_fn_type = ptr_fn_llvm_type;
9773 g->any_frame_header_llvm_ty = frame_header_type;
9774 g->anyframe_fn_type = fn_type;
97749775 }
97759776
97769777 ZigList<LLVMTypeRef> field_types = {};
src/stage1/codegen.cpp+24-23
......@@ -1161,7 +1161,7 @@ static LLVMValueRef gen_prefetch(CodeGen *g) {
11611161 LLVMInt32Type(),
11621162 };
11631163 LLVMTypeRef fn_type = LLVMFunctionType(LLVMVoidType(), param_types, 4, false);
1164 g->prefetch = LLVMAddFunction(g->module, "llvm.prefetch.p0i8", fn_type);
1164 g->prefetch = LLVMAddFunction(g->module, "llvm.prefetch.p0", fn_type);
11651165 assert(LLVMGetIntrinsicID(g->prefetch));
11661166
11671167 return g->prefetch;
......@@ -2745,8 +2745,8 @@ static void gen_assert_resume_id(CodeGen *g, Stage1AirInst *source_instr, Resume
27452745 LLVMPositionBuilderAtEnd(g->builder, end_bb);
27462746}
27472747
2748static LLVMValueRef gen_resume(CodeGen *g, LLVMValueRef fn_val, LLVMValueRef target_frame_ptr,
2749 ResumeId resume_id)
2748static LLVMValueRef gen_resume(CodeGen *g, LLVMTypeRef fn_llvm_ty, LLVMValueRef fn_val,
2749 LLVMValueRef target_frame_ptr, ResumeId resume_id)
27502750{
27512751 LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type;
27522752 if (fn_val == nullptr) {
......@@ -2758,7 +2758,8 @@ static LLVMValueRef gen_resume(CodeGen *g, LLVMValueRef fn_val, LLVMValueRef tar
27582758 LLVMValueRef arg_val = LLVMConstSub(LLVMConstAllOnes(usize_type_ref),
27592759 LLVMConstInt(usize_type_ref, resume_id, false));
27602760 LLVMValueRef args[] = {target_frame_ptr, arg_val};
2761 return ZigLLVMBuildCall(g->builder, LLVMGlobalGetValueType(fn_val), fn_val, args, 2, ZigLLVM_Fast, ZigLLVM_CallAttrAuto, "");
2761 return ZigLLVMBuildCall(g->builder, fn_llvm_ty, fn_val, args, 2, ZigLLVM_Fast,
2762 ZigLLVM_CallAttrAuto, "");
27622763}
27632764
27642765static LLVMBasicBlockRef gen_suspend_begin(CodeGen *g, const char *name_hint) {
......@@ -2900,7 +2901,7 @@ static void gen_async_return(CodeGen *g, Stage1AirInstReturn *instruction) {
29002901 ZigType *any_frame_type = get_any_frame_type(g, ret_type);
29012902 LLVMValueRef their_frame_ptr = LLVMBuildIntToPtr(g->builder, prev_val,
29022903 get_llvm_type(g, any_frame_type), "");
2903 LLVMValueRef call_inst = gen_resume(g, nullptr, their_frame_ptr, ResumeIdReturn);
2904 LLVMValueRef call_inst = gen_resume(g, g->anyframe_fn_type, nullptr, their_frame_ptr, ResumeIdReturn);
29042905 set_tail_call_if_appropriate(g, call_inst);
29052906 LLVMBuildRetVoid(g->builder);
29062907}
......@@ -4986,7 +4987,7 @@ static void gen_init_stack_trace(CodeGen *g, LLVMValueRef trace_field_ptr, LLVMV
49864987 addrs_slice_ptr, slice_ptr_index, "");
49874988 LLVMValueRef indices[] = { LLVMConstNull(usize_type_ref), LLVMConstNull(usize_type_ref) };
49884989 LLVMValueRef trace_field_addrs_as_ptr = LLVMBuildInBoundsGEP2(g->builder,
4989 usize_type_ref, addrs_field_ptr, indices, 2, "");
4990 ZigLLVMGetGEPResultElementType(addrs_field_ptr), addrs_field_ptr, indices, 2, "");
49904991 LLVMBuildStore(g->builder, trace_field_addrs_as_ptr, addrs_ptr_ptr);
49914992
49924993 LLVMValueRef addrs_len_ptr = LLVMBuildStructGEP2(g->builder,
......@@ -5064,8 +5065,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
50645065 frame_struct_llvm_ty = get_llvm_type(g, instruction->new_stack->value->type->data.pointer.child_type);
50655066 } else {
50665067 LLVMValueRef frame_slice_ptr = ir_llvm_value(g, instruction->new_stack);
5067 LLVMTypeRef frame_slice_llvm_ty =
5068 get_llvm_type(g, instruction->new_stack->value->type->data.pointer.child_type);
5068 LLVMTypeRef frame_slice_llvm_ty = get_llvm_type(g, instruction->new_stack->value->type);
50695069 if (ir_want_runtime_safety(g, &instruction->base)) {
50705070 LLVMValueRef given_len_ptr = LLVMBuildStructGEP2(g->builder,
50715071 frame_slice_llvm_ty, frame_slice_ptr, slice_len_index, "");
......@@ -5091,7 +5091,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
50915091 if (instruction->fn_entry == nullptr) {
50925092 anyframe_type = get_any_frame_type(g, src_return_type);
50935093 frame_result_loc = LLVMBuildBitCast(g->builder, frame_ptr, get_llvm_type(g, anyframe_type), "");
5094 frame_struct_llvm_ty = g->any_frame_header_llvm_ty;
5094 frame_struct_llvm_ty = anyframe_type->data.any_frame.struct_llvm_ty;
50955095 } else {
50965096 ZigType *frame_type = get_fn_frame_type(g, instruction->fn_entry);
50975097 if ((err = type_resolve(g, frame_type, ResolveStatusLLVMFull)))
......@@ -5168,7 +5168,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
51685168
51695169 LLVMValueRef fn_ptr_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty, frame_result_loc, frame_fn_ptr_index, "");
51705170 LLVMValueRef bitcasted_fn_val = LLVMBuildBitCast(g->builder, fn_val,
5171 ZigLLVMGetGEPResultElementType(fn_ptr_ptr), "");
5171 LLVMPointerTypeInContext(LLVMGetGlobalContext(), 0), "");
51725172 LLVMBuildStore(g->builder, bitcasted_fn_val, fn_ptr_ptr);
51735173
51745174 LLVMValueRef resume_index_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty, frame_result_loc, frame_resume_index, "");
......@@ -5326,14 +5326,14 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
53265326 gen_param_types.deinit();
53275327
53285328 if (instruction->modifier == CallModifierAsync) {
5329 gen_resume(g, fn_val, frame_result_loc, ResumeIdCall);
5329 gen_resume(g, fn_llvm_ty, fn_val, frame_result_loc, ResumeIdCall);
53305330 if (instruction->new_stack != nullptr) {
53315331 return LLVMBuildBitCast(g->builder, frame_result_loc,
53325332 get_llvm_type(g, instruction->base.value->type), "");
53335333 }
53345334 return nullptr;
53355335 } else if (instruction->modifier == CallModifierNoSuspend && !fn_is_async(g->cur_fn)) {
5336 gen_resume(g, fn_val, frame_result_loc, ResumeIdCall);
5336 gen_resume(g, fn_llvm_ty, fn_val, frame_result_loc, ResumeIdCall);
53375337
53385338 if (ir_want_runtime_safety(g, &instruction->base)) {
53395339 LLVMValueRef awaiter_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty,
......@@ -5364,7 +5364,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
53645364
53655365 LLVMBasicBlockRef call_bb = gen_suspend_begin(g, "CallResume");
53665366
5367 LLVMValueRef call_inst = gen_resume(g, fn_val, frame_result_loc, ResumeIdCall);
5367 LLVMValueRef call_inst = gen_resume(g, fn_llvm_ty, fn_val, frame_result_loc, ResumeIdCall);
53685368 set_tail_call_if_appropriate(g, call_inst);
53695369 LLVMBuildRetVoid(g->builder);
53705370
......@@ -5387,7 +5387,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
53875387 if (need_frame_ptr_ptr_spill) {
53885388 LLVMValueRef frame_slice_ptr = ir_llvm_value(g, instruction->new_stack);
53895389 LLVMValueRef frame_ptr_ptr = LLVMBuildStructGEP2(g->builder,
5390 get_llvm_type(g, instruction->new_stack->value->type->data.pointer.child_type),
5390 get_llvm_type(g, instruction->new_stack->value->type),
53915391 frame_slice_ptr, slice_ptr_index, "");
53925392 frame_result_loc_uncasted = LLVMBuildLoad2(g->builder,
53935393 ZigLLVMGetGEPResultElementType(frame_ptr_ptr), frame_ptr_ptr, "");
......@@ -5400,7 +5400,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
54005400 } else {
54015401 frame_result_loc = LLVMBuildBitCast(g->builder, frame_result_loc_uncasted,
54025402 get_llvm_type(g, anyframe_type), "");
5403 frame_struct_llvm_ty = g->any_frame_header_llvm_ty;
5403 frame_struct_llvm_ty = anyframe_type->data.any_frame.struct_llvm_ty;
54045404 }
54055405 }
54065406
......@@ -7498,7 +7498,6 @@ static LLVMValueRef ir_render_vector_to_array(CodeGen *g, Stage1Air *executable,
74987498 LLVMValueRef vector = ir_llvm_value(g, instruction->vector);
74997499
75007500 ZigType *elem_type = array_type->data.array.child_type;
7501 LLVMTypeRef elem_llvm_ty = get_llvm_type(g, elem_type);
75027501 bool bitcast_ok = elem_type->size_in_bits == elem_type->abi_size * 8;
75037502 if (bitcast_ok) {
75047503 LLVMValueRef casted_ptr = LLVMBuildBitCast(g->builder, result_loc,
......@@ -7511,11 +7510,12 @@ static LLVMValueRef ir_render_vector_to_array(CodeGen *g, Stage1Air *executable,
75117510 LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type;
75127511 LLVMTypeRef u32_type_ref = LLVMInt32Type();
75137512 LLVMValueRef zero = LLVMConstInt(usize_type_ref, 0, false);
7513 LLVMTypeRef array_llvm_ty = get_llvm_type(g, array_type);
75147514 for (uintptr_t i = 0; i < instruction->vector->value->type->data.vector.len; i++) {
75157515 LLVMValueRef index_usize = LLVMConstInt(usize_type_ref, i, false);
75167516 LLVMValueRef index_u32 = LLVMConstInt(u32_type_ref, i, false);
75177517 LLVMValueRef indexes[] = { zero, index_usize };
7518 LLVMValueRef elem_ptr = LLVMBuildInBoundsGEP2(g->builder, elem_llvm_ty, result_loc, indexes, 2, "");
7518 LLVMValueRef elem_ptr = LLVMBuildInBoundsGEP2(g->builder, array_llvm_ty, result_loc, indexes, 2, "");
75197519 LLVMValueRef elem = LLVMBuildExtractElement(g->builder, vector, index_u32, "");
75207520 LLVMBuildStore(g->builder, elem, elem_ptr);
75217521 }
......@@ -7534,11 +7534,11 @@ static LLVMValueRef ir_render_array_to_vector(CodeGen *g, Stage1Air *executable,
75347534
75357535 ZigType *elem_type = vector_type->data.vector.elem_type;
75367536 bool bitcast_ok = elem_type->size_in_bits == elem_type->abi_size * 8;
7537 ZigType *array_type = instruction->array->value->type;
7538 ir_assert(array_type->id == ZigTypeIdArray, &instruction->base);
75377539 if (bitcast_ok) {
75387540 LLVMValueRef casted_ptr = LLVMBuildBitCast(g->builder, array_ptr,
75397541 LLVMPointerType(vector_type_ref, 0), "");
7540 ZigType *array_type = instruction->array->value->type;
7541 assert(array_type->id == ZigTypeIdArray);
75427542 uint32_t alignment = get_abi_alignment(g, array_type->data.array.child_type);
75437543 return gen_load_untyped(g, vector_type_ref, casted_ptr, alignment, false, "");
75447544 } else {
......@@ -7548,12 +7548,13 @@ static LLVMValueRef ir_render_array_to_vector(CodeGen *g, Stage1Air *executable,
75487548 LLVMTypeRef u32_type_ref = LLVMInt32Type();
75497549 LLVMValueRef zero = LLVMConstInt(usize_type_ref, 0, false);
75507550 LLVMValueRef vector = LLVMGetUndef(vector_type_ref);
7551 LLVMTypeRef array_llvm_ty = get_llvm_type(g, array_type);
75517552 LLVMTypeRef elem_llvm_ty = get_llvm_type(g, elem_type);
75527553 for (uintptr_t i = 0; i < instruction->base.value->type->data.vector.len; i++) {
75537554 LLVMValueRef index_usize = LLVMConstInt(usize_type_ref, i, false);
75547555 LLVMValueRef index_u32 = LLVMConstInt(u32_type_ref, i, false);
75557556 LLVMValueRef indexes[] = { zero, index_usize };
7556 LLVMValueRef elem_ptr = LLVMBuildInBoundsGEP2(g->builder, elem_llvm_ty, array_ptr,
7557 LLVMValueRef elem_ptr = LLVMBuildInBoundsGEP2(g->builder, array_llvm_ty, array_ptr,
75577558 indexes, 2, "");
75587559 LLVMValueRef elem = LLVMBuildLoad2(g->builder, elem_llvm_ty, elem_ptr, "");
75597560 vector = LLVMBuildInsertElement(g->builder, vector, elem, index_u32, "");
......@@ -7668,8 +7669,8 @@ static LLVMValueRef ir_render_await(CodeGen *g, Stage1Air *executable, Stage1Air
76687669 LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type;
76697670 LLVMValueRef zero = LLVMConstNull(usize_type_ref);
76707671 LLVMValueRef target_frame_ptr = ir_llvm_value(g, instruction->frame);
7671 LLVMTypeRef target_frame_llvm_ty = get_llvm_type(g,
7672 instruction->frame->value->type->data.pointer.child_type);
7672 ir_assert(instruction->frame->value->type->id == ZigTypeIdAnyFrame, &instruction->base);
7673 LLVMTypeRef target_frame_llvm_ty = instruction->frame->value->type->data.any_frame.struct_llvm_ty;
76737674 ZigType *result_type = instruction->base.value->type;
76747675 ZigType *ptr_result_type = get_pointer_to_type(g, result_type, true);
76757676
......@@ -7760,7 +7761,7 @@ static LLVMValueRef ir_render_resume(CodeGen *g, Stage1Air *executable, Stage1Ai
77607761 ZigType *frame_type = instruction->frame->value->type;
77617762 assert(frame_type->id == ZigTypeIdAnyFrame);
77627763
7763 gen_resume(g, nullptr, frame, ResumeIdManual);
7764 gen_resume(g, g->anyframe_fn_type, nullptr, frame, ResumeIdManual);
77647765 return nullptr;
77657766}
77667767