| ... | ... | @@ -1161,7 +1161,7 @@ static LLVMValueRef gen_prefetch(CodeGen *g) { |
| 1161 | 1161 | LLVMInt32Type(), |
| 1162 | 1162 | }; |
| 1163 | 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 | 1165 | assert(LLVMGetIntrinsicID(g->prefetch)); |
| 1166 | 1166 | |
| 1167 | 1167 | return g->prefetch; |
| ... | ... | @@ -2745,8 +2745,8 @@ static void gen_assert_resume_id(CodeGen *g, Stage1AirInst *source_instr, Resume |
| 2745 | 2745 | LLVMPositionBuilderAtEnd(g->builder, end_bb); |
| 2746 | 2746 | } |
| 2747 | 2747 | |
| 2748 | | static LLVMValueRef gen_resume(CodeGen *g, LLVMValueRef fn_val, LLVMValueRef target_frame_ptr, |
| 2749 | | ResumeId resume_id) |
| 2748 | static LLVMValueRef gen_resume(CodeGen *g, LLVMTypeRef fn_llvm_ty, LLVMValueRef fn_val, |
| 2749 | LLVMValueRef target_frame_ptr, ResumeId resume_id) |
| 2750 | 2750 | { |
| 2751 | 2751 | LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type; |
| 2752 | 2752 | if (fn_val == nullptr) { |
| ... | ... | @@ -2758,7 +2758,8 @@ static LLVMValueRef gen_resume(CodeGen *g, LLVMValueRef fn_val, LLVMValueRef tar |
| 2758 | 2758 | LLVMValueRef arg_val = LLVMConstSub(LLVMConstAllOnes(usize_type_ref), |
| 2759 | 2759 | LLVMConstInt(usize_type_ref, resume_id, false)); |
| 2760 | 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 | } |
| 2763 | 2764 | |
| 2764 | 2765 | static LLVMBasicBlockRef gen_suspend_begin(CodeGen *g, const char *name_hint) { |
| ... | ... | @@ -2900,7 +2901,7 @@ static void gen_async_return(CodeGen *g, Stage1AirInstReturn *instruction) { |
| 2900 | 2901 | ZigType *any_frame_type = get_any_frame_type(g, ret_type); |
| 2901 | 2902 | LLVMValueRef their_frame_ptr = LLVMBuildIntToPtr(g->builder, prev_val, |
| 2902 | 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 | 2905 | set_tail_call_if_appropriate(g, call_inst); |
| 2905 | 2906 | LLVMBuildRetVoid(g->builder); |
| 2906 | 2907 | } |
| ... | ... | @@ -4986,7 +4987,7 @@ static void gen_init_stack_trace(CodeGen *g, LLVMValueRef trace_field_ptr, LLVMV |
| 4986 | 4987 | addrs_slice_ptr, slice_ptr_index, ""); |
| 4987 | 4988 | LLVMValueRef indices[] = { LLVMConstNull(usize_type_ref), LLVMConstNull(usize_type_ref) }; |
| 4988 | 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 | 4991 | LLVMBuildStore(g->builder, trace_field_addrs_as_ptr, addrs_ptr_ptr); |
| 4991 | 4992 | |
| 4992 | 4993 | LLVMValueRef addrs_len_ptr = LLVMBuildStructGEP2(g->builder, |
| ... | ... | @@ -5064,8 +5065,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI |
| 5064 | 5065 | frame_struct_llvm_ty = get_llvm_type(g, instruction->new_stack->value->type->data.pointer.child_type); |
| 5065 | 5066 | } else { |
| 5066 | 5067 | 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); |
| 5069 | 5069 | if (ir_want_runtime_safety(g, &instruction->base)) { |
| 5070 | 5070 | LLVMValueRef given_len_ptr = LLVMBuildStructGEP2(g->builder, |
| 5071 | 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 | 5091 | if (instruction->fn_entry == nullptr) { |
| 5092 | 5092 | anyframe_type = get_any_frame_type(g, src_return_type); |
| 5093 | 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 | 5095 | } else { |
| 5096 | 5096 | ZigType *frame_type = get_fn_frame_type(g, instruction->fn_entry); |
| 5097 | 5097 | if ((err = type_resolve(g, frame_type, ResolveStatusLLVMFull))) |
| ... | ... | @@ -5168,7 +5168,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI |
| 5168 | 5168 | |
| 5169 | 5169 | LLVMValueRef fn_ptr_ptr = LLVMBuildStructGEP2(g->builder, frame_struct_llvm_ty, frame_result_loc, frame_fn_ptr_index, ""); |
| 5170 | 5170 | LLVMValueRef bitcasted_fn_val = LLVMBuildBitCast(g->builder, fn_val, |
| 5171 | | ZigLLVMGetGEPResultElementType(fn_ptr_ptr), ""); |
| 5171 | LLVMPointerTypeInContext(LLVMGetGlobalContext(), 0), ""); |
| 5172 | 5172 | LLVMBuildStore(g->builder, bitcasted_fn_val, fn_ptr_ptr); |
| 5173 | 5173 | |
| 5174 | 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 | 5326 | gen_param_types.deinit(); |
| 5327 | 5327 | |
| 5328 | 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 | 5330 | if (instruction->new_stack != nullptr) { |
| 5331 | 5331 | return LLVMBuildBitCast(g->builder, frame_result_loc, |
| 5332 | 5332 | get_llvm_type(g, instruction->base.value->type), ""); |
| 5333 | 5333 | } |
| 5334 | 5334 | return nullptr; |
| 5335 | 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); |
| 5337 | 5337 | |
| 5338 | 5338 | if (ir_want_runtime_safety(g, &instruction->base)) { |
| 5339 | 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 | 5364 | |
| 5365 | 5365 | LLVMBasicBlockRef call_bb = gen_suspend_begin(g, "CallResume"); |
| 5366 | 5366 | |
| 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 | 5368 | set_tail_call_if_appropriate(g, call_inst); |
| 5369 | 5369 | LLVMBuildRetVoid(g->builder); |
| 5370 | 5370 | |
| ... | ... | @@ -5387,7 +5387,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI |
| 5387 | 5387 | if (need_frame_ptr_ptr_spill) { |
| 5388 | 5388 | LLVMValueRef frame_slice_ptr = ir_llvm_value(g, instruction->new_stack); |
| 5389 | 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 | 5391 | frame_slice_ptr, slice_ptr_index, ""); |
| 5392 | 5392 | frame_result_loc_uncasted = LLVMBuildLoad2(g->builder, |
| 5393 | 5393 | ZigLLVMGetGEPResultElementType(frame_ptr_ptr), frame_ptr_ptr, ""); |
| ... | ... | @@ -5400,7 +5400,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI |
| 5400 | 5400 | } else { |
| 5401 | 5401 | frame_result_loc = LLVMBuildBitCast(g->builder, frame_result_loc_uncasted, |
| 5402 | 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 | } |
| 5406 | 5406 | |
| ... | ... | @@ -7498,7 +7498,6 @@ static LLVMValueRef ir_render_vector_to_array(CodeGen *g, Stage1Air *executable, |
| 7498 | 7498 | LLVMValueRef vector = ir_llvm_value(g, instruction->vector); |
| 7499 | 7499 | |
| 7500 | 7500 | ZigType *elem_type = array_type->data.array.child_type; |
| 7501 | | LLVMTypeRef elem_llvm_ty = get_llvm_type(g, elem_type); |
| 7502 | 7501 | bool bitcast_ok = elem_type->size_in_bits == elem_type->abi_size * 8; |
| 7503 | 7502 | if (bitcast_ok) { |
| 7504 | 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 | 7510 | LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type; |
| 7512 | 7511 | LLVMTypeRef u32_type_ref = LLVMInt32Type(); |
| 7513 | 7512 | LLVMValueRef zero = LLVMConstInt(usize_type_ref, 0, false); |
| 7513 | LLVMTypeRef array_llvm_ty = get_llvm_type(g, array_type); |
| 7514 | 7514 | for (uintptr_t i = 0; i < instruction->vector->value->type->data.vector.len; i++) { |
| 7515 | 7515 | LLVMValueRef index_usize = LLVMConstInt(usize_type_ref, i, false); |
| 7516 | 7516 | LLVMValueRef index_u32 = LLVMConstInt(u32_type_ref, i, false); |
| 7517 | 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 | 7519 | LLVMValueRef elem = LLVMBuildExtractElement(g->builder, vector, index_u32, ""); |
| 7520 | 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 | 7534 | |
| 7535 | 7535 | ZigType *elem_type = vector_type->data.vector.elem_type; |
| 7536 | 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 | 7539 | if (bitcast_ok) { |
| 7538 | 7540 | LLVMValueRef casted_ptr = LLVMBuildBitCast(g->builder, array_ptr, |
| 7539 | 7541 | LLVMPointerType(vector_type_ref, 0), ""); |
| 7540 | | ZigType *array_type = instruction->array->value->type; |
| 7541 | | assert(array_type->id == ZigTypeIdArray); |
| 7542 | 7542 | uint32_t alignment = get_abi_alignment(g, array_type->data.array.child_type); |
| 7543 | 7543 | return gen_load_untyped(g, vector_type_ref, casted_ptr, alignment, false, ""); |
| 7544 | 7544 | } else { |
| ... | ... | @@ -7548,12 +7548,13 @@ static LLVMValueRef ir_render_array_to_vector(CodeGen *g, Stage1Air *executable, |
| 7548 | 7548 | LLVMTypeRef u32_type_ref = LLVMInt32Type(); |
| 7549 | 7549 | LLVMValueRef zero = LLVMConstInt(usize_type_ref, 0, false); |
| 7550 | 7550 | LLVMValueRef vector = LLVMGetUndef(vector_type_ref); |
| 7551 | LLVMTypeRef array_llvm_ty = get_llvm_type(g, array_type); |
| 7551 | 7552 | LLVMTypeRef elem_llvm_ty = get_llvm_type(g, elem_type); |
| 7552 | 7553 | for (uintptr_t i = 0; i < instruction->base.value->type->data.vector.len; i++) { |
| 7553 | 7554 | LLVMValueRef index_usize = LLVMConstInt(usize_type_ref, i, false); |
| 7554 | 7555 | LLVMValueRef index_u32 = LLVMConstInt(u32_type_ref, i, false); |
| 7555 | 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 | 7558 | indexes, 2, ""); |
| 7558 | 7559 | LLVMValueRef elem = LLVMBuildLoad2(g->builder, elem_llvm_ty, elem_ptr, ""); |
| 7559 | 7560 | vector = LLVMBuildInsertElement(g->builder, vector, elem, index_u32, ""); |
| ... | ... | @@ -7668,8 +7669,8 @@ static LLVMValueRef ir_render_await(CodeGen *g, Stage1Air *executable, Stage1Air |
| 7668 | 7669 | LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type; |
| 7669 | 7670 | LLVMValueRef zero = LLVMConstNull(usize_type_ref); |
| 7670 | 7671 | 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; |
| 7673 | 7674 | ZigType *result_type = instruction->base.value->type; |
| 7674 | 7675 | ZigType *ptr_result_type = get_pointer_to_type(g, result_type, true); |
| 7675 | 7676 | |
| ... | ... | @@ -7760,7 +7761,7 @@ static LLVMValueRef ir_render_resume(CodeGen *g, Stage1Air *executable, Stage1Ai |
| 7760 | 7761 | ZigType *frame_type = instruction->frame->value->type; |
| 7761 | 7762 | assert(frame_type->id == ZigTypeIdAnyFrame); |
| 7762 | 7763 | |
| 7763 | | gen_resume(g, nullptr, frame, ResumeIdManual); |
| 7764 | gen_resume(g, g->anyframe_fn_type, nullptr, frame, ResumeIdManual); |
| 7764 | 7765 | return nullptr; |
| 7765 | 7766 | } |
| 7766 | 7767 | |