@@ -1211,16 +1211,12 @@ static IrInstruction *ir_build_call(IrBuilder *irb, Scope *scope, AstNode *sourc
1211
1211
call_instruction->new_stack = new_stack;
1212
1212
call_instruction->result_loc = result_loc;
1213
1213
1214
- if (fn_ref)
1215
- ir_ref_instruction(fn_ref, irb->current_basic_block);
1214
+ if (fn_ref) ir_ref_instruction(fn_ref, irb->current_basic_block);
1216
1215
for (size_t i = 0; i < arg_count; i += 1)
1217
1216
ir_ref_instruction(args[i], irb->current_basic_block);
1218
- if (async_allocator)
1219
- ir_ref_instruction(async_allocator, irb->current_basic_block);
1220
- if (new_stack != nullptr)
1221
- ir_ref_instruction(new_stack, irb->current_basic_block);
1222
-
1223
- ir_ref_instruction(result_loc, irb->current_basic_block);
1217
+ if (async_allocator != nullptr) ir_ref_instruction(async_allocator, irb->current_basic_block);
1218
+ if (new_stack != nullptr) ir_ref_instruction(new_stack, irb->current_basic_block);
1219
+ if (result_loc != nullptr) ir_ref_instruction(result_loc, irb->current_basic_block);
1224
1220
1225
1221
return &call_instruction->base;
1226
1222
}
@@ -13108,6 +13104,26 @@ static IrInstruction *ir_get_var_ptr(IrAnalyze *ira, IrInstruction *instruction,
13108
13104
return var_ptr_instruction;
13109
13105
}
13110
13106
13107
+ static Error resolve_alloca_inference(IrAnalyze *ira, IrInstructionAllocaGen *alloca, ZigType *child_type) {
13108
+ Error err;
13109
+ if ((err = type_resolve(ira->codegen, child_type, ResolveStatusZeroBitsKnown)))
13110
+ return err;
13111
+ alloca->base.value.type = get_pointer_to_type_extra(ira->codegen, child_type, false, false,
13112
+ PtrLenSingle, alloca->align, 0, 0);
13113
+ return ErrorNone;
13114
+ }
13115
+
13116
+ static Error resolve_possible_alloca_inference(IrAnalyze *ira, IrInstruction *base, ZigType *child_type) {
13117
+ Error err;
13118
+ assert(base->value.type->id == ZigTypeIdPointer);
13119
+ ZigType *infer_child = base->value.type->data.pointer.child_type;
13120
+ if (base->id == IrInstructionIdAllocaGen && infer_child == ira->codegen->builtin_types.entry_infer) {
13121
+ if ((err = resolve_alloca_inference(ira, reinterpret_cast<IrInstructionAllocaGen *>(base), child_type)))
13122
+ return err;
13123
+ }
13124
+ return ErrorNone;
13125
+ }
13126
+
13111
13127
static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *call_instruction,
13112
13128
ZigFn *fn_entry, ZigType *fn_type, IrInstruction *fn_ref,
13113
13129
IrInstruction *first_arg_ptr, bool comptime_fn_call, FnInline fn_inline)
@@ -13650,10 +13666,20 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *call
13650
13666
return ira->codegen->invalid_instruction;
13651
13667
}
13652
13668
13669
+ IrInstruction *result_loc = nullptr;
13670
+
13671
+ if (handle_is_ptr(return_type)) {
13672
+ result_loc = call_instruction->result_loc->child;
13673
+ if (type_is_invalid(result_loc->value.type))
13674
+ return ira->codegen->invalid_instruction;
13675
+ if ((err = resolve_possible_alloca_inference(ira, result_loc, return_type)))
13676
+ return ira->codegen->invalid_instruction;
13677
+ }
13678
+
13653
13679
IrInstruction *new_call_instruction = ir_build_call(&ira->new_irb,
13654
13680
call_instruction->base.scope, call_instruction->base.source_node,
13655
13681
fn_entry, fn_ref, call_param_count, casted_args, false, fn_inline, false, nullptr,
13656
- casted_new_stack, nullptr );
13682
+ casted_new_stack, result_loc );
13657
13683
new_call_instruction->value.type = return_type;
13658
13684
return ir_finish_anal(ira, new_call_instruction);
13659
13685
}
@@ -15168,20 +15194,9 @@ static IrInstruction *ir_analyze_instruction_store_ptr(IrAnalyze *ira, IrInstruc
15168
15194
return ir_analyze_store_ptr(ira, &instruction->base, ptr, value);
15169
15195
}
15170
15196
15171
- static void resolve_alloca_inference(IrAnalyze *ira, IrInstructionAllocaGen *alloca, ZigType *child_type) {
15172
- alloca->base.value.type = get_pointer_to_type_extra(ira->codegen, child_type, false, false,
15173
- PtrLenSingle, alloca->align, 0, 0);
15174
- }
15175
-
15176
- static void resolve_possible_alloca_inference(IrAnalyze *ira, IrInstruction *base, ZigType *child_type) {
15177
- assert(base->value.type->id == ZigTypeIdPointer);
15178
- ZigType *infer_child = base->value.type->data.pointer.child_type;
15179
- if (base->id == IrInstructionIdAllocaGen && infer_child == ira->codegen->builtin_types.entry_infer) {
15180
- resolve_alloca_inference(ira, reinterpret_cast<IrInstructionAllocaGen *>(base), child_type);
15181
- }
15182
- }
15183
-
15184
15197
static IrInstruction *ir_analyze_instruction_store_result(IrAnalyze *ira, IrInstructionStoreResult *instruction) {
15198
+ Error err;
15199
+
15185
15200
IrInstruction *value = instruction->value->child;
15186
15201
if (type_is_invalid(value->value.type))
15187
15202
return ira->codegen->invalid_instruction;
@@ -15190,7 +15205,8 @@ static IrInstruction *ir_analyze_instruction_store_result(IrAnalyze *ira, IrInst
15190
15205
if (type_is_invalid(result_loc->value.type))
15191
15206
return ira->codegen->invalid_instruction;
15192
15207
15193
- resolve_possible_alloca_inference(ira, result_loc, value->value.type);
15208
+ if ((err = resolve_possible_alloca_inference(ira, result_loc, value->value.type)))
15209
+ return ira->codegen->invalid_instruction;
15194
15210
15195
15211
// If the type is a scalar value, treat this instruction as a normal store pointer instruction.
15196
15212
// Or if the value is comptime known, analyze it as a store pointer, so that the
@@ -20984,7 +21000,15 @@ static IrInstruction *ir_analyze_instruction_result_error_union_payload(IrAnalyz
20984
21000
}
20985
21001
20986
21002
static IrInstruction *ir_analyze_instruction_result_return(IrAnalyze *ira, IrInstructionResultReturn *instruction) {
20987
- zig_panic("TODO");
21003
+ ZigFn *fn = exec_fn_entry(ira->new_irb.exec);
21004
+ if (fn == nullptr) {
21005
+ ir_add_error(ira, &instruction->base, buf_sprintf("return outside function"));
21006
+ return ira->codegen->invalid_instruction;
21007
+ }
21008
+ ZigType *result_type = get_pointer_to_type(ira->codegen, fn->type_entry->data.fn.fn_type_id.return_type, false);
21009
+ IrInstruction *result = ir_build_result_return(&ira->new_irb, instruction->base.scope, instruction->base.source_node);
21010
+ result->value.type = result_type;
21011
+ return result;
20988
21012
}
20989
21013
20990
21014
static IrInstruction *ir_analyze_instruction_result_param(IrAnalyze *ira, IrInstructionResultParam *instruction) {
@@ -20996,6 +21020,8 @@ static IrInstruction *ir_analyze_instruction_result_ptr_cast(IrAnalyze *ira, IrI
20996
21020
}
20997
21021
20998
21022
static IrInstruction *ir_analyze_instruction_alloca(IrAnalyze *ira, IrInstructionAllocaSrc *instruction) {
21023
+ Error err;
21024
+
20999
21025
uint32_t align = 0;
21000
21026
if (instruction->align != nullptr) {
21001
21027
if (!ir_resolve_align(ira, instruction->align->child, &align)) {
@@ -21015,7 +21041,8 @@ static IrInstruction *ir_analyze_instruction_alloca(IrAnalyze *ira, IrInstructio
21015
21041
if (type_is_invalid(child_type))
21016
21042
return ira->codegen->invalid_instruction;
21017
21043
21018
- resolve_alloca_inference(ira, result, child_type);
21044
+ if ((err = resolve_alloca_inference(ira, result, child_type)))
21045
+ return ira->codegen->invalid_instruction;
21019
21046
}
21020
21047
21021
21048
ZigFn *fn_entry = exec_fn_entry(ira->new_irb.exec);
0 commit comments