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 {...@@ -1594,6 +1594,7 @@ struct ZigTypeFnFrame {
15941594
1595struct ZigTypeAnyFrame {1595struct ZigTypeAnyFrame {
1596 ZigType *result_type; // null if `anyframe` instead of `anyframe->T`1596 ZigType *result_type; // null if `anyframe` instead of `anyframe->T`
1597 LLVMTypeRef struct_llvm_ty;
1597};1598};
15981599
1599struct ZigType {1600struct 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...@@ -9746,8 +9746,8 @@ static void resolve_llvm_types_any_frame(CodeGen *g, ZigType *any_frame_type, Re
97469746
9747 Buf *name = buf_sprintf("(%s header)", buf_ptr(&any_frame_type->name));9747 Buf *name = buf_sprintf("(%s header)", buf_ptr(&any_frame_type->name));
9748 LLVMTypeRef frame_header_type = LLVMStructCreateNamed(LLVMGetGlobalContext(), buf_ptr(name));9748 LLVMTypeRef frame_header_type = LLVMStructCreateNamed(LLVMGetGlobalContext(), buf_ptr(name));
9749 g->any_frame_header_llvm_ty = frame_header_type;
9750 any_frame_type->llvm_type = LLVMPointerType(frame_header_type, 0);9749 any_frame_type->llvm_type = LLVMPointerType(frame_header_type, 0);
9750 any_frame_type->data.any_frame.struct_llvm_ty = frame_header_type;
97519751
9752 unsigned dwarf_kind = ZigLLVMTag_DW_structure_type();9752 unsigned dwarf_kind = ZigLLVMTag_DW_structure_type();
9753 ZigLLVMDIFile *di_file = nullptr;9753 ZigLLVMDIFile *di_file = nullptr;
...@@ -9770,7 +9770,8 @@ static void resolve_llvm_types_any_frame(CodeGen *g, ZigType *any_frame_type, Re...@@ -9770,7 +9770,8 @@ static void resolve_llvm_types_any_frame(CodeGen *g, ZigType *any_frame_type, Re
9770 const unsigned fn_addrspace = ZigLLVMDataLayoutGetProgramAddressSpace(g->target_data_ref);9770 const unsigned fn_addrspace = ZigLLVMDataLayoutGetProgramAddressSpace(g->target_data_ref);
9771 LLVMTypeRef ptr_fn_llvm_type = LLVMPointerType(fn_type, fn_addrspace);9771 LLVMTypeRef ptr_fn_llvm_type = LLVMPointerType(fn_type, fn_addrspace);
9772 if (result_type == nullptr) {9772 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;
9774 }9775 }
97759776
9776 ZigList<LLVMTypeRef> field_types = {};9777 ZigList<LLVMTypeRef> field_types = {};
src/stage1/codegen.cpp+24-23
...@@ -1161,7 +1161,7 @@ static LLVMValueRef gen_prefetch(CodeGen *g) {...@@ -1161,7 +1161,7 @@ static LLVMValueRef gen_prefetch(CodeGen *g) {
1161 LLVMInt32Type(),1161 LLVMInt32Type(),
1162 };1162 };
1163 LLVMTypeRef fn_type = LLVMFunctionType(LLVMVoidType(), param_types, 4, false);1163 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);
1165 assert(LLVMGetIntrinsicID(g->prefetch));1165 assert(LLVMGetIntrinsicID(g->prefetch));
11661166
1167 return g->prefetch;1167 return g->prefetch;
...@@ -2745,8 +2745,8 @@ static void gen_assert_resume_id(CodeGen *g, Stage1AirInst *source_instr, Resume...@@ -2745,8 +2745,8 @@ static void gen_assert_resume_id(CodeGen *g, Stage1AirInst *source_instr, Resume
2745 LLVMPositionBuilderAtEnd(g->builder, end_bb);2745 LLVMPositionBuilderAtEnd(g->builder, end_bb);
2746}2746}
27472747
2748static LLVMValueRef gen_resume(CodeGen *g, LLVMValueRef fn_val, LLVMValueRef target_frame_ptr,2748static LLVMValueRef gen_resume(CodeGen *g, LLVMTypeRef fn_llvm_ty, LLVMValueRef fn_val,
2749 ResumeId resume_id)2749 LLVMValueRef target_frame_ptr, ResumeId resume_id)
2750{2750{
2751 LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type;2751 LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type;
2752 if (fn_val == nullptr) {2752 if (fn_val == nullptr) {
...@@ -2758,7 +2758,8 @@ static LLVMValueRef gen_resume(CodeGen *g, LLVMValueRef fn_val, LLVMValueRef tar...@@ -2758,7 +2758,8 @@ static LLVMValueRef gen_resume(CodeGen *g, LLVMValueRef fn_val, LLVMValueRef tar
2758 LLVMValueRef arg_val = LLVMConstSub(LLVMConstAllOnes(usize_type_ref),2758 LLVMValueRef arg_val = LLVMConstSub(LLVMConstAllOnes(usize_type_ref),
2759 LLVMConstInt(usize_type_ref, resume_id, false));2759 LLVMConstInt(usize_type_ref, resume_id, false));
2760 LLVMValueRef args[] = {target_frame_ptr, arg_val};2760 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, "");
2762}2763}
27632764
2764static LLVMBasicBlockRef gen_suspend_begin(CodeGen *g, const char *name_hint) {2765static LLVMBasicBlockRef gen_suspend_begin(CodeGen *g, const char *name_hint) {
...@@ -2900,7 +2901,7 @@ static void gen_async_return(CodeGen *g, Stage1AirInstReturn *instruction) {...@@ -2900,7 +2901,7 @@ static void gen_async_return(CodeGen *g, Stage1AirInstReturn *instruction) {
2900 ZigType *any_frame_type = get_any_frame_type(g, ret_type);2901 ZigType *any_frame_type = get_any_frame_type(g, ret_type);
2901 LLVMValueRef their_frame_ptr = LLVMBuildIntToPtr(g->builder, prev_val,2902 LLVMValueRef their_frame_ptr = LLVMBuildIntToPtr(g->builder, prev_val,
2902 get_llvm_type(g, any_frame_type), "");2903 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);
2904 set_tail_call_if_appropriate(g, call_inst);2905 set_tail_call_if_appropriate(g, call_inst);
2905 LLVMBuildRetVoid(g->builder);2906 LLVMBuildRetVoid(g->builder);
2906}2907}
...@@ -4986,7 +4987,7 @@ static void gen_init_stack_trace(CodeGen *g, LLVMValueRef trace_field_ptr, LLVMV...@@ -4986,7 +4987,7 @@ static void gen_init_stack_trace(CodeGen *g, LLVMValueRef trace_field_ptr, LLVMV
4986 addrs_slice_ptr, slice_ptr_index, "");4987 addrs_slice_ptr, slice_ptr_index, "");
4987 LLVMValueRef indices[] = { LLVMConstNull(usize_type_ref), LLVMConstNull(usize_type_ref) };4988 LLVMValueRef indices[] = { LLVMConstNull(usize_type_ref), LLVMConstNull(usize_type_ref) };
4988 LLVMValueRef trace_field_addrs_as_ptr = LLVMBuildInBoundsGEP2(g->builder,4989 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, "");
4990 LLVMBuildStore(g->builder, trace_field_addrs_as_ptr, addrs_ptr_ptr);4991 LLVMBuildStore(g->builder, trace_field_addrs_as_ptr, addrs_ptr_ptr);
49914992
4992 LLVMValueRef addrs_len_ptr = LLVMBuildStructGEP2(g->builder,4993 LLVMValueRef addrs_len_ptr = LLVMBuildStructGEP2(g->builder,
...@@ -5064,8 +5065,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI...@@ -5064,8 +5065,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
5064 frame_struct_llvm_ty = get_llvm_type(g, instruction->new_stack->value->type->data.pointer.child_type);5065 frame_struct_llvm_ty = get_llvm_type(g, instruction->new_stack->value->type->data.pointer.child_type);
5065 } else {5066 } else {
5066 LLVMValueRef frame_slice_ptr = ir_llvm_value(g, instruction->new_stack);5067 LLVMValueRef frame_slice_ptr = ir_llvm_value(g, instruction->new_stack);
5067 LLVMTypeRef frame_slice_llvm_ty =5068 LLVMTypeRef frame_slice_llvm_ty = get_llvm_type(g, instruction->new_stack->value->type);
5068 get_llvm_type(g, instruction->new_stack->value->type->data.pointer.child_type);
5069 if (ir_want_runtime_safety(g, &instruction->base)) {5069 if (ir_want_runtime_safety(g, &instruction->base)) {
5070 LLVMValueRef given_len_ptr = LLVMBuildStructGEP2(g->builder,5070 LLVMValueRef given_len_ptr = LLVMBuildStructGEP2(g->builder,
5071 frame_slice_llvm_ty, frame_slice_ptr, slice_len_index, "");5071 frame_slice_llvm_ty, frame_slice_ptr, slice_len_index, "");
...@@ -5091,7 +5091,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI...@@ -5091,7 +5091,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
5091 if (instruction->fn_entry == nullptr) {5091 if (instruction->fn_entry == nullptr) {
5092 anyframe_type = get_any_frame_type(g, src_return_type);5092 anyframe_type = get_any_frame_type(g, src_return_type);
5093 frame_result_loc = LLVMBuildBitCast(g->builder, frame_ptr, get_llvm_type(g, anyframe_type), "");5093 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;
5095 } else {5095 } else {
5096 ZigType *frame_type = get_fn_frame_type(g, instruction->fn_entry);5096 ZigType *frame_type = get_fn_frame_type(g, instruction->fn_entry);
5097 if ((err = type_resolve(g, frame_type, ResolveStatusLLVMFull)))5097 if ((err = type_resolve(g, frame_type, ResolveStatusLLVMFull)))
...@@ -5168,7 +5168,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI...@@ -5168,7 +5168,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
51685168
5169 LLVMValueRef fn_ptr_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty, frame_result_loc, frame_fn_ptr_index, "");5169 LLVMValueRef fn_ptr_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty, frame_result_loc, frame_fn_ptr_index, "");
5170 LLVMValueRef bitcasted_fn_val = LLVMBuildBitCast(g->builder, fn_val,5170 LLVMValueRef bitcasted_fn_val = LLVMBuildBitCast(g->builder, fn_val,
5171 ZigLLVMGetGEPResultElementType(fn_ptr_ptr), "");5171 LLVMPointerTypeInContext(LLVMGetGlobalContext(), 0), "");
5172 LLVMBuildStore(g->builder, bitcasted_fn_val, fn_ptr_ptr);5172 LLVMBuildStore(g->builder, bitcasted_fn_val, fn_ptr_ptr);
51735173
5174 LLVMValueRef resume_index_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty, frame_result_loc, frame_resume_index, "");5174 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...@@ -5326,14 +5326,14 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
5326 gen_param_types.deinit();5326 gen_param_types.deinit();
53275327
5328 if (instruction->modifier == CallModifierAsync) {5328 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);
5330 if (instruction->new_stack != nullptr) {5330 if (instruction->new_stack != nullptr) {
5331 return LLVMBuildBitCast(g->builder, frame_result_loc,5331 return LLVMBuildBitCast(g->builder, frame_result_loc,
5332 get_llvm_type(g, instruction->base.value->type), "");5332 get_llvm_type(g, instruction->base.value->type), "");
5333 }5333 }
5334 return nullptr;5334 return nullptr;
5335 } else if (instruction->modifier == CallModifierNoSuspend && !fn_is_async(g->cur_fn)) {5335 } 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
5338 if (ir_want_runtime_safety(g, &instruction->base)) {5338 if (ir_want_runtime_safety(g, &instruction->base)) {
5339 LLVMValueRef awaiter_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty,5339 LLVMValueRef awaiter_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty,
...@@ -5364,7 +5364,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI...@@ -5364,7 +5364,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
53645364
5365 LLVMBasicBlockRef call_bb = gen_suspend_begin(g, "CallResume");5365 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);
5368 set_tail_call_if_appropriate(g, call_inst);5368 set_tail_call_if_appropriate(g, call_inst);
5369 LLVMBuildRetVoid(g->builder);5369 LLVMBuildRetVoid(g->builder);
53705370
...@@ -5387,7 +5387,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI...@@ -5387,7 +5387,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
5387 if (need_frame_ptr_ptr_spill) {5387 if (need_frame_ptr_ptr_spill) {
5388 LLVMValueRef frame_slice_ptr = ir_llvm_value(g, instruction->new_stack);5388 LLVMValueRef frame_slice_ptr = ir_llvm_value(g, instruction->new_stack);
5389 LLVMValueRef frame_ptr_ptr = LLVMBuildStructGEP2(g->builder,5389 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),
5391 frame_slice_ptr, slice_ptr_index, "");5391 frame_slice_ptr, slice_ptr_index, "");
5392 frame_result_loc_uncasted = LLVMBuildLoad2(g->builder,5392 frame_result_loc_uncasted = LLVMBuildLoad2(g->builder,
5393 ZigLLVMGetGEPResultElementType(frame_ptr_ptr), frame_ptr_ptr, "");5393 ZigLLVMGetGEPResultElementType(frame_ptr_ptr), frame_ptr_ptr, "");
...@@ -5400,7 +5400,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI...@@ -5400,7 +5400,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI
5400 } else {5400 } else {
5401 frame_result_loc = LLVMBuildBitCast(g->builder, frame_result_loc_uncasted,5401 frame_result_loc = LLVMBuildBitCast(g->builder, frame_result_loc_uncasted,
5402 get_llvm_type(g, anyframe_type), "");5402 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;
5404 }5404 }
5405 }5405 }
54065406
...@@ -7498,7 +7498,6 @@ static LLVMValueRef ir_render_vector_to_array(CodeGen *g, Stage1Air *executable,...@@ -7498,7 +7498,6 @@ static LLVMValueRef ir_render_vector_to_array(CodeGen *g, Stage1Air *executable,
7498 LLVMValueRef vector = ir_llvm_value(g, instruction->vector);7498 LLVMValueRef vector = ir_llvm_value(g, instruction->vector);
74997499
7500 ZigType *elem_type = array_type->data.array.child_type;7500 ZigType *elem_type = array_type->data.array.child_type;
7501 LLVMTypeRef elem_llvm_ty = get_llvm_type(g, elem_type);
7502 bool bitcast_ok = elem_type->size_in_bits == elem_type->abi_size * 8;7501 bool bitcast_ok = elem_type->size_in_bits == elem_type->abi_size * 8;
7503 if (bitcast_ok) {7502 if (bitcast_ok) {
7504 LLVMValueRef casted_ptr = LLVMBuildBitCast(g->builder, result_loc,7503 LLVMValueRef casted_ptr = LLVMBuildBitCast(g->builder, result_loc,
...@@ -7511,11 +7510,12 @@ static LLVMValueRef ir_render_vector_to_array(CodeGen *g, Stage1Air *executable,...@@ -7511,11 +7510,12 @@ static LLVMValueRef ir_render_vector_to_array(CodeGen *g, Stage1Air *executable,
7511 LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type;7510 LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type;
7512 LLVMTypeRef u32_type_ref = LLVMInt32Type();7511 LLVMTypeRef u32_type_ref = LLVMInt32Type();
7513 LLVMValueRef zero = LLVMConstInt(usize_type_ref, 0, false);7512 LLVMValueRef zero = LLVMConstInt(usize_type_ref, 0, false);
7513 LLVMTypeRef array_llvm_ty = get_llvm_type(g, array_type);
7514 for (uintptr_t i = 0; i < instruction->vector->value->type->data.vector.len; i++) {7514 for (uintptr_t i = 0; i < instruction->vector->value->type->data.vector.len; i++) {
7515 LLVMValueRef index_usize = LLVMConstInt(usize_type_ref, i, false);7515 LLVMValueRef index_usize = LLVMConstInt(usize_type_ref, i, false);
7516 LLVMValueRef index_u32 = LLVMConstInt(u32_type_ref, i, false);7516 LLVMValueRef index_u32 = LLVMConstInt(u32_type_ref, i, false);
7517 LLVMValueRef indexes[] = { zero, index_usize };7517 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, "");
7519 LLVMValueRef elem = LLVMBuildExtractElement(g->builder, vector, index_u32, "");7519 LLVMValueRef elem = LLVMBuildExtractElement(g->builder, vector, index_u32, "");
7520 LLVMBuildStore(g->builder, elem, elem_ptr);7520 LLVMBuildStore(g->builder, elem, elem_ptr);
7521 }7521 }
...@@ -7534,11 +7534,11 @@ static LLVMValueRef ir_render_array_to_vector(CodeGen *g, Stage1Air *executable,...@@ -7534,11 +7534,11 @@ static LLVMValueRef ir_render_array_to_vector(CodeGen *g, Stage1Air *executable,
75347534
7535 ZigType *elem_type = vector_type->data.vector.elem_type;7535 ZigType *elem_type = vector_type->data.vector.elem_type;
7536 bool bitcast_ok = elem_type->size_in_bits == elem_type->abi_size * 8;7536 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);
7537 if (bitcast_ok) {7539 if (bitcast_ok) {
7538 LLVMValueRef casted_ptr = LLVMBuildBitCast(g->builder, array_ptr,7540 LLVMValueRef casted_ptr = LLVMBuildBitCast(g->builder, array_ptr,
7539 LLVMPointerType(vector_type_ref, 0), "");7541 LLVMPointerType(vector_type_ref, 0), "");
7540 ZigType *array_type = instruction->array->value->type;
7541 assert(array_type->id == ZigTypeIdArray);
7542 uint32_t alignment = get_abi_alignment(g, array_type->data.array.child_type);7542 uint32_t alignment = get_abi_alignment(g, array_type->data.array.child_type);
7543 return gen_load_untyped(g, vector_type_ref, casted_ptr, alignment, false, "");7543 return gen_load_untyped(g, vector_type_ref, casted_ptr, alignment, false, "");
7544 } else {7544 } else {
...@@ -7548,12 +7548,13 @@ static LLVMValueRef ir_render_array_to_vector(CodeGen *g, Stage1Air *executable,...@@ -7548,12 +7548,13 @@ static LLVMValueRef ir_render_array_to_vector(CodeGen *g, Stage1Air *executable,
7548 LLVMTypeRef u32_type_ref = LLVMInt32Type();7548 LLVMTypeRef u32_type_ref = LLVMInt32Type();
7549 LLVMValueRef zero = LLVMConstInt(usize_type_ref, 0, false);7549 LLVMValueRef zero = LLVMConstInt(usize_type_ref, 0, false);
7550 LLVMValueRef vector = LLVMGetUndef(vector_type_ref);7550 LLVMValueRef vector = LLVMGetUndef(vector_type_ref);
7551 LLVMTypeRef array_llvm_ty = get_llvm_type(g, array_type);
7551 LLVMTypeRef elem_llvm_ty = get_llvm_type(g, elem_type);7552 LLVMTypeRef elem_llvm_ty = get_llvm_type(g, elem_type);
7552 for (uintptr_t i = 0; i < instruction->base.value->type->data.vector.len; i++) {7553 for (uintptr_t i = 0; i < instruction->base.value->type->data.vector.len; i++) {
7553 LLVMValueRef index_usize = LLVMConstInt(usize_type_ref, i, false);7554 LLVMValueRef index_usize = LLVMConstInt(usize_type_ref, i, false);
7554 LLVMValueRef index_u32 = LLVMConstInt(u32_type_ref, i, false);7555 LLVMValueRef index_u32 = LLVMConstInt(u32_type_ref, i, false);
7555 LLVMValueRef indexes[] = { zero, index_usize };7556 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,
7557 indexes, 2, "");7558 indexes, 2, "");
7558 LLVMValueRef elem = LLVMBuildLoad2(g->builder, elem_llvm_ty, elem_ptr, "");7559 LLVMValueRef elem = LLVMBuildLoad2(g->builder, elem_llvm_ty, elem_ptr, "");
7559 vector = LLVMBuildInsertElement(g->builder, vector, elem, index_u32, "");7560 vector = LLVMBuildInsertElement(g->builder, vector, elem, index_u32, "");
...@@ -7668,8 +7669,8 @@ static LLVMValueRef ir_render_await(CodeGen *g, Stage1Air *executable, Stage1Air...@@ -7668,8 +7669,8 @@ static LLVMValueRef ir_render_await(CodeGen *g, Stage1Air *executable, Stage1Air
7668 LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type;7669 LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type;
7669 LLVMValueRef zero = LLVMConstNull(usize_type_ref);7670 LLVMValueRef zero = LLVMConstNull(usize_type_ref);
7670 LLVMValueRef target_frame_ptr = ir_llvm_value(g, instruction->frame);7671 LLVMValueRef target_frame_ptr = ir_llvm_value(g, instruction->frame);
7671 LLVMTypeRef target_frame_llvm_ty = get_llvm_type(g,7672 ir_assert(instruction->frame->value->type->id == ZigTypeIdAnyFrame, &instruction->base);
7672 instruction->frame->value->type->data.pointer.child_type);7673 LLVMTypeRef target_frame_llvm_ty = instruction->frame->value->type->data.any_frame.struct_llvm_ty;
7673 ZigType *result_type = instruction->base.value->type;7674 ZigType *result_type = instruction->base.value->type;
7674 ZigType *ptr_result_type = get_pointer_to_type(g, result_type, true);7675 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...@@ -7760,7 +7761,7 @@ static LLVMValueRef ir_render_resume(CodeGen *g, Stage1Air *executable, Stage1Ai
7760 ZigType *frame_type = instruction->frame->value->type;7761 ZigType *frame_type = instruction->frame->value->type;
7761 assert(frame_type->id == ZigTypeIdAnyFrame);7762 assert(frame_type->id == ZigTypeIdAnyFrame);
77627763
7763 gen_resume(g, nullptr, frame, ResumeIdManual);7764 gen_resume(g, g->anyframe_fn_type, nullptr, frame, ResumeIdManual);
7764 return nullptr;7765 return nullptr;
7765}7766}
77667767