| ... | ... | @@ -189,7 +189,7 @@ static IrInstruction *ir_analyze_bit_cast(IrAnalyze *ira, IrInstruction *source_ |
| 189 | 189 | static IrInstruction *ir_resolve_result_raw(IrAnalyze *ira, IrInstruction *suspend_source_instr, |
| 190 | 190 | ResultLoc *result_loc, ZigType *value_type, IrInstruction *value); |
| 191 | 191 | static IrInstruction *ir_resolve_result(IrAnalyze *ira, IrInstruction *suspend_source_instr, |
| 192 | | ResultLoc *result_loc, ZigType *value_type, IrInstruction *value); |
| 192 | ResultLoc *result_loc, ZigType *value_type, IrInstruction *value, bool force_runtime); |
| 193 | 193 | static IrInstruction *ir_analyze_unwrap_optional_payload(IrAnalyze *ira, IrInstruction *source_instr, |
| 194 | 194 | IrInstruction *base_ptr, bool safety_check_on, bool initializing); |
| 195 | 195 | static IrInstruction *ir_analyze_unwrap_error_payload(IrAnalyze *ira, IrInstruction *source_instr, |
| ... | ... | @@ -261,6 +261,15 @@ static bool is_opt_err_set(ZigType *ty) { |
| 261 | 261 | (ty->id == ZigTypeIdOptional && ty->data.maybe.child_type->id == ZigTypeIdErrorSet); |
| 262 | 262 | } |
| 263 | 263 | |
| 264 | static bool is_slice(ZigType *type) { |
| 265 | return type->id == ZigTypeIdStruct && type->data.structure.is_slice; |
| 266 | } |
| 267 | |
| 268 | static bool slice_is_const(ZigType *type) { |
| 269 | assert(is_slice(type)); |
| 270 | return type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_const; |
| 271 | } |
| 272 | |
| 264 | 273 | // This function returns true when you can change the type of a ConstExprValue and the |
| 265 | 274 | // value remains meaningful. |
| 266 | 275 | static bool types_have_same_zig_comptime_repr(ZigType *a, ZigType *b) { |
| ... | ... | @@ -297,8 +306,9 @@ static bool types_have_same_zig_comptime_repr(ZigType *a, ZigType *b) { |
| 297 | 306 | return a->data.floating.bit_count == b->data.floating.bit_count; |
| 298 | 307 | case ZigTypeIdInt: |
| 299 | 308 | return a->data.integral.is_signed == b->data.integral.is_signed; |
| 300 | | case ZigTypeIdArray: |
| 301 | 309 | case ZigTypeIdStruct: |
| 310 | return is_slice(a) && is_slice(b); |
| 311 | case ZigTypeIdArray: |
| 302 | 312 | case ZigTypeIdOptional: |
| 303 | 313 | case ZigTypeIdErrorUnion: |
| 304 | 314 | case ZigTypeIdEnum: |
| ... | ... | @@ -1317,17 +1327,18 @@ static IrInstruction *ir_build_return_ptr(IrAnalyze *ira, IrInstruction *source_ |
| 1317 | 1327 | |
| 1318 | 1328 | static IrInstruction *ir_build_elem_ptr(IrBuilder *irb, Scope *scope, AstNode *source_node, |
| 1319 | 1329 | IrInstruction *array_ptr, IrInstruction *elem_index, bool safety_check_on, PtrLen ptr_len, |
| 1320 | | bool initializing) |
| 1330 | IrInstruction *init_array_type) |
| 1321 | 1331 | { |
| 1322 | 1332 | IrInstructionElemPtr *instruction = ir_build_instruction<IrInstructionElemPtr>(irb, scope, source_node); |
| 1323 | 1333 | instruction->array_ptr = array_ptr; |
| 1324 | 1334 | instruction->elem_index = elem_index; |
| 1325 | 1335 | instruction->safety_check_on = safety_check_on; |
| 1326 | 1336 | instruction->ptr_len = ptr_len; |
| 1327 | | instruction->initializing = initializing; |
| 1337 | instruction->init_array_type = init_array_type; |
| 1328 | 1338 | |
| 1329 | 1339 | ir_ref_instruction(array_ptr, irb->current_basic_block); |
| 1330 | 1340 | ir_ref_instruction(elem_index, irb->current_basic_block); |
| 1341 | if (init_array_type != nullptr) ir_ref_instruction(init_array_type, irb->current_basic_block); |
| 1331 | 1342 | |
| 1332 | 1343 | return &instruction->base; |
| 1333 | 1344 | } |
| ... | ... | @@ -4269,7 +4280,7 @@ static IrInstruction *ir_gen_array_access(IrBuilder *irb, Scope *scope, AstNode |
| 4269 | 4280 | return subscript_instruction; |
| 4270 | 4281 | |
| 4271 | 4282 | IrInstruction *ptr_instruction = ir_build_elem_ptr(irb, scope, node, array_ref_instruction, |
| 4272 | | subscript_instruction, true, PtrLenSingle, false); |
| 4283 | subscript_instruction, true, PtrLenSingle, nullptr); |
| 4273 | 4284 | if (lval == LValPtr) |
| 4274 | 4285 | return ptr_instruction; |
| 4275 | 4286 | |
| ... | ... | @@ -5809,7 +5820,7 @@ static IrInstruction *ir_gen_container_init_expr(IrBuilder *irb, Scope *scope, A |
| 5809 | 5820 | |
| 5810 | 5821 | IrInstruction *elem_index = ir_build_const_usize(irb, scope, expr_node, i); |
| 5811 | 5822 | IrInstruction *elem_ptr = ir_build_elem_ptr(irb, scope, expr_node, container_ptr, elem_index, |
| 5812 | | false, PtrLenSingle, true); |
| 5823 | false, PtrLenSingle, container_type); |
| 5813 | 5824 | ResultLocInstruction *result_loc_inst = allocate<ResultLocInstruction>(1); |
| 5814 | 5825 | result_loc_inst->base.id = ResultLocIdInstruction; |
| 5815 | 5826 | result_loc_inst->base.source_instruction = elem_ptr; |
| ... | ... | @@ -6313,7 +6324,7 @@ static IrInstruction *ir_gen_for_expr(IrBuilder *irb, Scope *parent_scope, AstNo |
| 6313 | 6324 | |
| 6314 | 6325 | ir_set_cursor_at_end_and_append_block(irb, body_block); |
| 6315 | 6326 | IrInstruction *elem_ptr = ir_build_elem_ptr(irb, parent_scope, node, array_val_ptr, index_val, false, |
| 6316 | | PtrLenSingle, false); |
| 6327 | PtrLenSingle, nullptr); |
| 6317 | 6328 | // TODO make it an error to write to element variable or i variable. |
| 6318 | 6329 | Buf *elem_var_name = elem_node->data.symbol_expr.symbol; |
| 6319 | 6330 | ZigVar *elem_var = ir_create_var(irb, elem_node, parent_scope, elem_var_name, true, false, false, is_comptime); |
| ... | ... | @@ -9614,15 +9625,6 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstruction *instruc |
| 9614 | 9625 | return false; |
| 9615 | 9626 | } |
| 9616 | 9627 | |
| 9617 | | static bool is_slice(ZigType *type) { |
| 9618 | | return type->id == ZigTypeIdStruct && type->data.structure.is_slice; |
| 9619 | | } |
| 9620 | | |
| 9621 | | static bool slice_is_const(ZigType *type) { |
| 9622 | | assert(is_slice(type)); |
| 9623 | | return type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_const; |
| 9624 | | } |
| 9625 | | |
| 9626 | 9628 | static bool is_tagged_union(ZigType *type) { |
| 9627 | 9629 | if (type->id != ZigTypeIdUnion) |
| 9628 | 9630 | return false; |
| ... | ... | @@ -10831,7 +10833,7 @@ static IrInstruction *ir_resolve_ptr_of_array_to_slice(IrAnalyze *ira, IrInstruc |
| 10831 | 10833 | } |
| 10832 | 10834 | |
| 10833 | 10835 | if (result_loc == nullptr) result_loc = no_result_loc(); |
| 10834 | | IrInstruction *result_loc_inst = ir_resolve_result(ira, source_instr, result_loc, wanted_type, nullptr); |
| 10836 | IrInstruction *result_loc_inst = ir_resolve_result(ira, source_instr, result_loc, wanted_type, nullptr, true); |
| 10835 | 10837 | if (type_is_invalid(result_loc_inst->value.type) || instr_is_unreachable(result_loc_inst)) { |
| 10836 | 10838 | return result_loc_inst; |
| 10837 | 10839 | } |
| ... | ... | @@ -11265,7 +11267,7 @@ static IrInstruction *ir_analyze_optional_wrap(IrAnalyze *ira, IrInstruction *so |
| 11265 | 11267 | } |
| 11266 | 11268 | |
| 11267 | 11269 | if (result_loc == nullptr) result_loc = no_result_loc(); |
| 11268 | | IrInstruction *result_loc_inst = ir_resolve_result(ira, source_instr, result_loc, wanted_type, nullptr); |
| 11270 | IrInstruction *result_loc_inst = ir_resolve_result(ira, source_instr, result_loc, wanted_type, nullptr, true); |
| 11269 | 11271 | if (type_is_invalid(result_loc_inst->value.type) || instr_is_unreachable(result_loc_inst)) { |
| 11270 | 11272 | return result_loc_inst; |
| 11271 | 11273 | } |
| ... | ... | @@ -11307,7 +11309,7 @@ static IrInstruction *ir_analyze_err_wrap_payload(IrAnalyze *ira, IrInstruction |
| 11307 | 11309 | IrInstruction *result_loc_inst; |
| 11308 | 11310 | if (handle_is_ptr(wanted_type)) { |
| 11309 | 11311 | if (result_loc == nullptr) result_loc = no_result_loc(); |
| 11310 | | result_loc_inst = ir_resolve_result(ira, source_instr, result_loc, wanted_type, nullptr); |
| 11312 | result_loc_inst = ir_resolve_result(ira, source_instr, result_loc, wanted_type, nullptr, true); |
| 11311 | 11313 | if (type_is_invalid(result_loc_inst->value.type) || instr_is_unreachable(result_loc_inst)) { |
| 11312 | 11314 | return result_loc_inst; |
| 11313 | 11315 | } |
| ... | ... | @@ -11392,7 +11394,7 @@ static IrInstruction *ir_analyze_err_wrap_code(IrAnalyze *ira, IrInstruction *so |
| 11392 | 11394 | IrInstruction *result_loc_inst; |
| 11393 | 11395 | if (handle_is_ptr(wanted_type)) { |
| 11394 | 11396 | if (result_loc == nullptr) result_loc = no_result_loc(); |
| 11395 | | result_loc_inst = ir_resolve_result(ira, source_instr, result_loc, wanted_type, nullptr); |
| 11397 | result_loc_inst = ir_resolve_result(ira, source_instr, result_loc, wanted_type, nullptr, true); |
| 11396 | 11398 | if (type_is_invalid(result_loc_inst->value.type) || instr_is_unreachable(result_loc_inst)) { |
| 11397 | 11399 | return result_loc_inst; |
| 11398 | 11400 | } |
| ... | ... | @@ -11465,7 +11467,7 @@ static IrInstruction *ir_get_ref(IrAnalyze *ira, IrInstruction *source_instructi |
| 11465 | 11467 | |
| 11466 | 11468 | IrInstruction *result_loc; |
| 11467 | 11469 | if (type_has_bits(ptr_type) && !handle_is_ptr(value->value.type)) { |
| 11468 | | result_loc = ir_resolve_result(ira, source_instruction, no_result_loc(), value->value.type, nullptr); |
| 11470 | result_loc = ir_resolve_result(ira, source_instruction, no_result_loc(), value->value.type, nullptr, true); |
| 11469 | 11471 | } else { |
| 11470 | 11472 | result_loc = nullptr; |
| 11471 | 11473 | } |
| ... | ... | @@ -11509,7 +11511,7 @@ static IrInstruction *ir_analyze_array_to_slice(IrAnalyze *ira, IrInstruction *s |
| 11509 | 11511 | if (!array_ptr) array_ptr = ir_get_ref(ira, source_instr, array, true, false); |
| 11510 | 11512 | |
| 11511 | 11513 | if (result_loc == nullptr) result_loc = no_result_loc(); |
| 11512 | | IrInstruction *result_loc_inst = ir_resolve_result(ira, source_instr, result_loc, wanted_type, nullptr); |
| 11514 | IrInstruction *result_loc_inst = ir_resolve_result(ira, source_instr, result_loc, wanted_type, nullptr, true); |
| 11513 | 11515 | if (type_is_invalid(result_loc_inst->value.type) || instr_is_unreachable(result_loc_inst)) { |
| 11514 | 11516 | return result_loc_inst; |
| 11515 | 11517 | } |
| ... | ... | @@ -12162,7 +12164,7 @@ static IrInstruction *ir_analyze_vector_to_array(IrAnalyze *ira, IrInstruction * |
| 12162 | 12164 | result->value.type = array_type; |
| 12163 | 12165 | return result; |
| 12164 | 12166 | } |
| 12165 | | IrInstruction *result_loc_inst = ir_resolve_result(ira, source_instr, result_loc, array_type, nullptr); |
| 12167 | IrInstruction *result_loc_inst = ir_resolve_result(ira, source_instr, result_loc, array_type, nullptr, true); |
| 12166 | 12168 | if (type_is_invalid(result_loc_inst->value.type) || instr_is_unreachable(result_loc_inst)) { |
| 12167 | 12169 | return result_loc_inst; |
| 12168 | 12170 | } |
| ... | ... | @@ -12743,7 +12745,7 @@ static IrInstruction *ir_get_deref(IrAnalyze *ira, IrInstruction *source_instruc |
| 12743 | 12745 | IrInstruction *result_loc_inst; |
| 12744 | 12746 | if (type_entry->data.pointer.host_int_bytes != 0 && handle_is_ptr(child_type)) { |
| 12745 | 12747 | if (result_loc == nullptr) result_loc = no_result_loc(); |
| 12746 | | result_loc_inst = ir_resolve_result(ira, source_instruction, result_loc, child_type, nullptr); |
| 12748 | result_loc_inst = ir_resolve_result(ira, source_instruction, result_loc, child_type, nullptr, true); |
| 12747 | 12749 | if (type_is_invalid(result_loc_inst->value.type) || instr_is_unreachable(result_loc_inst)) { |
| 12748 | 12750 | return result_loc_inst; |
| 12749 | 12751 | } |
| ... | ... | @@ -14923,7 +14925,7 @@ static IrInstruction *ir_resolve_result_raw(IrAnalyze *ira, IrInstruction *suspe |
| 14923 | 14925 | return ira->codegen->invalid_instruction; |
| 14924 | 14926 | } |
| 14925 | 14927 | IrInstruction *alloca_gen; |
| 14926 | | if (is_comptime) { |
| 14928 | if (is_comptime && value != nullptr) { |
| 14927 | 14929 | if (align > value->value.global_refs->align) { |
| 14928 | 14930 | value->value.global_refs->align = align; |
| 14929 | 14931 | } |
| ... | ... | @@ -14978,12 +14980,14 @@ static IrInstruction *ir_resolve_result_raw(IrAnalyze *ira, IrInstruction *suspe |
| 14978 | 14980 | } |
| 14979 | 14981 | |
| 14980 | 14982 | IrInstruction *parent_result_loc = ir_resolve_result(ira, suspend_source_instr, peer_parent->parent, |
| 14981 | | peer_parent->resolved_type, nullptr); |
| 14983 | peer_parent->resolved_type, nullptr, false); |
| 14982 | 14984 | if (parent_result_loc == nullptr || type_is_invalid(parent_result_loc->value.type) || |
| 14983 | 14985 | parent_result_loc->value.type->id == ZigTypeIdUnreachable) |
| 14984 | 14986 | { |
| 14985 | 14987 | return parent_result_loc; |
| 14986 | 14988 | } |
| 14989 | // because is_comptime is false, we mark this a runtime pointer |
| 14990 | parent_result_loc->value.data.x_ptr.mut = ConstPtrMutRuntimeVar; |
| 14987 | 14991 | result_loc->written = true; |
| 14988 | 14992 | result_loc->resolved_loc = parent_result_loc; |
| 14989 | 14993 | return result_loc->resolved_loc; |
| ... | ... | @@ -15026,7 +15030,7 @@ static IrInstruction *ir_resolve_result_raw(IrAnalyze *ira, IrInstruction *suspe |
| 15026 | 15030 | } |
| 15027 | 15031 | |
| 15028 | 15032 | IrInstruction *parent_result_loc = ir_resolve_result(ira, suspend_source_instr, result_bit_cast->parent, |
| 15029 | | dest_type, bitcasted_value); |
| 15033 | dest_type, bitcasted_value, false); |
| 15030 | 15034 | if (parent_result_loc == nullptr || type_is_invalid(parent_result_loc->value.type) || |
| 15031 | 15035 | parent_result_loc->value.type->id == ZigTypeIdUnreachable) |
| 15032 | 15036 | { |
| ... | ... | @@ -15054,12 +15058,17 @@ static IrInstruction *ir_resolve_result_raw(IrAnalyze *ira, IrInstruction *suspe |
| 15054 | 15058 | } |
| 15055 | 15059 | |
| 15056 | 15060 | static IrInstruction *ir_resolve_result(IrAnalyze *ira, IrInstruction *suspend_source_instr, |
| 15057 | | ResultLoc *result_loc_pass1, ZigType *value_type, IrInstruction *value) |
| 15061 | ResultLoc *result_loc_pass1, ZigType *value_type, IrInstruction *value, bool force_runtime) |
| 15058 | 15062 | { |
| 15059 | 15063 | IrInstruction *result_loc = ir_resolve_result_raw(ira, suspend_source_instr, result_loc_pass1, value_type, |
| 15060 | 15064 | value); |
| 15061 | 15065 | if (result_loc == nullptr || (instr_is_unreachable(result_loc) || type_is_invalid(result_loc->value.type))) |
| 15062 | 15066 | return result_loc; |
| 15067 | |
| 15068 | if (force_runtime && result_loc_pass1->written && result_loc->value.data.x_ptr.mut == ConstPtrMutInfer) { |
| 15069 | result_loc->value.special = ConstValSpecialRuntime; |
| 15070 | } |
| 15071 | |
| 15063 | 15072 | ir_assert(result_loc->value.type->id == ZigTypeIdPointer, suspend_source_instr); |
| 15064 | 15073 | ZigType *actual_elem_type = result_loc->value.type->data.pointer.child_type; |
| 15065 | 15074 | if (actual_elem_type->id == ZigTypeIdOptional && value_type->id != ZigTypeIdOptional && |
| ... | ... | @@ -15099,10 +15108,20 @@ static IrInstruction *ir_analyze_instruction_resolve_result(IrAnalyze *ira, IrIn |
| 15099 | 15108 | ZigType *implicit_elem_type = ir_resolve_type(ira, instruction->ty->child); |
| 15100 | 15109 | if (type_is_invalid(implicit_elem_type)) |
| 15101 | 15110 | return ira->codegen->invalid_instruction; |
| 15102 | | IrInstruction *result_loc = ir_resolve_result(ira, &instruction->base, instruction->result_loc, implicit_elem_type, nullptr); |
| 15103 | | if (result_loc != nullptr) |
| 15104 | | return result_loc; |
| 15105 | | zig_panic("TODO"); |
| 15111 | ResultLoc *old_result_loc = instruction->result_loc; |
| 15112 | for (;;) { |
| 15113 | IrInstruction *result_loc = ir_resolve_result(ira, &instruction->base, old_result_loc, |
| 15114 | implicit_elem_type, nullptr, false); |
| 15115 | if (result_loc != nullptr) |
| 15116 | return result_loc; |
| 15117 | |
| 15118 | if (instruction->result_loc->id == ResultLocIdPeer) { |
| 15119 | old_result_loc = reinterpret_cast<ResultLocPeer *>(instruction->result_loc)->parent->parent; |
| 15120 | continue; |
| 15121 | } |
| 15122 | ir_assert(false, &instruction->base); // TODO |
| 15123 | zig_unreachable(); |
| 15124 | } |
| 15106 | 15125 | } |
| 15107 | 15126 | |
| 15108 | 15127 | static void ir_reset_result(ResultLoc *result_loc) { |
| ... | ... | @@ -15484,13 +15503,6 @@ static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source |
| 15484 | 15503 | return result; |
| 15485 | 15504 | } |
| 15486 | 15505 | |
| 15487 | | static void mark_inferred_ptr_runtime(IrInstruction *ptr) { |
| 15488 | | ir_assert(ptr->value.type->id == ZigTypeIdPointer, ptr); |
| 15489 | | if (ptr->value.data.x_ptr.mut == ConstPtrMutInfer) { |
| 15490 | | ptr->value.special = ConstValSpecialRuntime; |
| 15491 | | } |
| 15492 | | } |
| 15493 | | |
| 15494 | 15506 | static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *call_instruction, |
| 15495 | 15507 | ZigFn *fn_entry, ZigType *fn_type, IrInstruction *fn_ref, |
| 15496 | 15508 | IrInstruction *first_arg_ptr, bool comptime_fn_call, FnInline fn_inline) |
| ... | ... | @@ -15931,11 +15943,10 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c |
| 15931 | 15943 | IrInstruction *result_loc; |
| 15932 | 15944 | if (handle_is_ptr(impl_fn_type_id->return_type)) { |
| 15933 | 15945 | result_loc = ir_resolve_result(ira, &call_instruction->base, call_instruction->result_loc, |
| 15934 | | impl_fn_type_id->return_type, nullptr); |
| 15946 | impl_fn_type_id->return_type, nullptr, true); |
| 15935 | 15947 | if (type_is_invalid(result_loc->value.type) || instr_is_unreachable(result_loc)) { |
| 15936 | 15948 | return result_loc; |
| 15937 | 15949 | } |
| 15938 | | mark_inferred_ptr_runtime(result_loc); |
| 15939 | 15950 | } else { |
| 15940 | 15951 | result_loc = nullptr; |
| 15941 | 15952 | } |
| ... | ... | @@ -16052,11 +16063,10 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c |
| 16052 | 16063 | IrInstruction *result_loc; |
| 16053 | 16064 | if (handle_is_ptr(return_type)) { |
| 16054 | 16065 | result_loc = ir_resolve_result(ira, &call_instruction->base, call_instruction->result_loc, |
| 16055 | | return_type, nullptr); |
| 16066 | return_type, nullptr, true); |
| 16056 | 16067 | if (type_is_invalid(result_loc->value.type) || instr_is_unreachable(result_loc)) { |
| 16057 | 16068 | return result_loc; |
| 16058 | 16069 | } |
| 16059 | | mark_inferred_ptr_runtime(result_loc); |
| 16060 | 16070 | } else { |
| 16061 | 16071 | result_loc = nullptr; |
| 16062 | 16072 | } |
| ... | ... | @@ -16547,7 +16557,7 @@ static IrInstruction *ir_analyze_instruction_phi(IrAnalyze *ira, IrInstructionPh |
| 16547 | 16557 | |
| 16548 | 16558 | // In case resolving the parent activates a suspend, do it now |
| 16549 | 16559 | IrInstruction *parent_result_loc = ir_resolve_result(ira, &phi_instruction->base, peer_parent->parent, |
| 16550 | | peer_parent->resolved_type, nullptr); |
| 16560 | peer_parent->resolved_type, nullptr, false); |
| 16551 | 16561 | if (parent_result_loc != nullptr && |
| 16552 | 16562 | (type_is_invalid(parent_result_loc->value.type) || instr_is_unreachable(parent_result_loc))) |
| 16553 | 16563 | { |
| ... | ... | @@ -16893,19 +16903,45 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct |
| 16893 | 16903 | if (array_ptr_val == nullptr) |
| 16894 | 16904 | return ira->codegen->invalid_instruction; |
| 16895 | 16905 | |
| 16896 | | if (array_ptr_val->special == ConstValSpecialUndef && array_type->id == ZigTypeIdArray && |
| 16897 | | elem_ptr_instruction->initializing) |
| 16898 | | { |
| 16899 | | array_ptr_val->data.x_array.special = ConstArraySpecialNone; |
| 16900 | | array_ptr_val->data.x_array.data.s_none.elements = create_const_vals(array_type->data.array.len); |
| 16901 | | array_ptr_val->special = ConstValSpecialStatic; |
| 16902 | | for (size_t i = 0; i < array_type->data.array.len; i += 1) { |
| 16903 | | ConstExprValue *elem_val = &array_ptr_val->data.x_array.data.s_none.elements[i]; |
| 16904 | | elem_val->special = ConstValSpecialUndef; |
| 16905 | | elem_val->type = array_type->data.array.child_type; |
| 16906 | | elem_val->parent.id = ConstParentIdArray; |
| 16907 | | elem_val->parent.data.p_array.array_val = array_ptr_val; |
| 16908 | | elem_val->parent.data.p_array.elem_index = i; |
| 16906 | if (array_ptr_val->special == ConstValSpecialUndef && elem_ptr_instruction->init_array_type != nullptr) { |
| 16907 | if (array_type->id == ZigTypeIdArray) { |
| 16908 | array_ptr_val->data.x_array.special = ConstArraySpecialNone; |
| 16909 | array_ptr_val->data.x_array.data.s_none.elements = create_const_vals(array_type->data.array.len); |
| 16910 | array_ptr_val->special = ConstValSpecialStatic; |
| 16911 | for (size_t i = 0; i < array_type->data.array.len; i += 1) { |
| 16912 | ConstExprValue *elem_val = &array_ptr_val->data.x_array.data.s_none.elements[i]; |
| 16913 | elem_val->special = ConstValSpecialUndef; |
| 16914 | elem_val->type = array_type->data.array.child_type; |
| 16915 | elem_val->parent.id = ConstParentIdArray; |
| 16916 | elem_val->parent.data.p_array.array_val = array_ptr_val; |
| 16917 | elem_val->parent.data.p_array.elem_index = i; |
| 16918 | } |
| 16919 | } else if (is_slice(array_type)) { |
| 16920 | ZigType *actual_array_type = ir_resolve_type(ira, elem_ptr_instruction->init_array_type->child); |
| 16921 | if (type_is_invalid(actual_array_type)) |
| 16922 | return ira->codegen->invalid_instruction; |
| 16923 | assert(actual_array_type->id == ZigTypeIdArray); |
| 16924 | |
| 16925 | ConstExprValue *array_init_val = create_const_vals(1); |
| 16926 | array_init_val->special = ConstValSpecialStatic; |
| 16927 | array_init_val->type = actual_array_type; |
| 16928 | array_init_val->data.x_array.special = ConstArraySpecialNone; |
| 16929 | array_init_val->data.x_array.data.s_none.elements = create_const_vals(actual_array_type->data.array.len); |
| 16930 | array_init_val->special = ConstValSpecialStatic; |
| 16931 | for (size_t i = 0; i < actual_array_type->data.array.len; i += 1) { |
| 16932 | ConstExprValue *elem_val = &array_init_val->data.x_array.data.s_none.elements[i]; |
| 16933 | elem_val->special = ConstValSpecialUndef; |
| 16934 | elem_val->type = actual_array_type->data.array.child_type; |
| 16935 | elem_val->parent.id = ConstParentIdArray; |
| 16936 | elem_val->parent.data.p_array.array_val = array_init_val; |
| 16937 | elem_val->parent.data.p_array.elem_index = i; |
| 16938 | } |
| 16939 | |
| 16940 | init_const_slice(ira->codegen, array_ptr_val, array_init_val, 0, actual_array_type->data.array.len, |
| 16941 | false); |
| 16942 | array_ptr_val->data.x_struct.fields[slice_ptr_index].data.x_ptr.mut = ConstPtrMutInfer; |
| 16943 | } else { |
| 16944 | zig_unreachable(); |
| 16909 | 16945 | } |
| 16910 | 16946 | } |
| 16911 | 16947 | |
| ... | ... | @@ -16976,7 +17012,7 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct |
| 16976 | 17012 | if (ptr_field->data.x_ptr.special == ConstPtrSpecialHardCodedAddr) { |
| 16977 | 17013 | IrInstruction *result = ir_build_elem_ptr(&ira->new_irb, elem_ptr_instruction->base.scope, |
| 16978 | 17014 | elem_ptr_instruction->base.source_node, array_ptr, casted_elem_index, false, |
| 16979 | | elem_ptr_instruction->ptr_len, false); |
| 17015 | elem_ptr_instruction->ptr_len, nullptr); |
| 16980 | 17016 | result->value.type = return_type; |
| 16981 | 17017 | return result; |
| 16982 | 17018 | } |
| ... | ... | @@ -17033,7 +17069,7 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct |
| 17033 | 17069 | if (orig_array_ptr_val->data.x_ptr.mut == ConstPtrMutInfer) { |
| 17034 | 17070 | result = ir_build_elem_ptr(&ira->new_irb, elem_ptr_instruction->base.scope, |
| 17035 | 17071 | elem_ptr_instruction->base.source_node, array_ptr, casted_elem_index, |
| 17036 | | false, elem_ptr_instruction->ptr_len, elem_ptr_instruction->initializing); |
| 17072 | false, elem_ptr_instruction->ptr_len, elem_ptr_instruction->init_array_type); |
| 17037 | 17073 | result->value.type = return_type; |
| 17038 | 17074 | result->value.special = ConstValSpecialStatic; |
| 17039 | 17075 | } else { |
| ... | ... | @@ -17077,7 +17113,7 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct |
| 17077 | 17113 | |
| 17078 | 17114 | IrInstruction *result = ir_build_elem_ptr(&ira->new_irb, elem_ptr_instruction->base.scope, |
| 17079 | 17115 | elem_ptr_instruction->base.source_node, array_ptr, casted_elem_index, safety_check_on, |
| 17080 | | elem_ptr_instruction->ptr_len, elem_ptr_instruction->initializing); |
| 17116 | elem_ptr_instruction->ptr_len, elem_ptr_instruction->init_array_type); |
| 17081 | 17117 | result->value.type = return_type; |
| 17082 | 17118 | return result; |
| 17083 | 17119 | } |
| ... | ... | @@ -18963,7 +18999,7 @@ static IrInstruction *ir_analyze_container_init_fields_union(IrAnalyze *ira, IrI |
| 18963 | 18999 | if (instr_is_comptime(field_result_loc) && |
| 18964 | 19000 | field_result_loc->value.data.x_ptr.mut != ConstPtrMutRuntimeVar) |
| 18965 | 19001 | { |
| 18966 | | result_loc->value.data.x_ptr.mut = ConstPtrMutComptimeConst; |
| 19002 | // nothing |
| 18967 | 19003 | } else { |
| 18968 | 19004 | result_loc->value.special = ConstValSpecialRuntime; |
| 18969 | 19005 | } |
| ... | ... | @@ -19099,9 +19135,7 @@ static IrInstruction *ir_analyze_container_init_fields(IrAnalyze *ira, IrInstruc |
| 19099 | 19135 | return ira->codegen->invalid_instruction; |
| 19100 | 19136 | |
| 19101 | 19137 | if (result_loc->value.data.x_ptr.mut == ConstPtrMutInfer) { |
| 19102 | | if (const_ptrs.length == actual_field_count) { |
| 19103 | | result_loc->value.data.x_ptr.mut = ConstPtrMutComptimeConst; |
| 19104 | | } else { |
| 19138 | if (const_ptrs.length != actual_field_count) { |
| 19105 | 19139 | result_loc->value.special = ConstValSpecialRuntime; |
| 19106 | 19140 | for (size_t i = 0; i < const_ptrs.length; i += 1) { |
| 19107 | 19141 | IrInstruction *field_result_loc = const_ptrs.at(i); |
| ... | ... | @@ -19218,9 +19252,7 @@ static IrInstruction *ir_analyze_instruction_container_init_list(IrAnalyze *ira, |
| 19218 | 19252 | } |
| 19219 | 19253 | |
| 19220 | 19254 | if (result_loc->value.data.x_ptr.mut == ConstPtrMutInfer) { |
| 19221 | | if (const_ptrs.length == elem_count) { |
| 19222 | | result_loc->value.data.x_ptr.mut = ConstPtrMutComptimeConst; |
| 19223 | | } else { |
| 19255 | if (const_ptrs.length != elem_count) { |
| 19224 | 19256 | result_loc->value.special = ConstValSpecialRuntime; |
| 19225 | 19257 | for (size_t i = 0; i < const_ptrs.length; i += 1) { |
| 19226 | 19258 | IrInstruction *elem_result_loc = const_ptrs.at(i); |
| ... | ... | @@ -20884,18 +20916,6 @@ static IrInstruction *ir_analyze_instruction_cmpxchg(IrAnalyze *ira, IrInstructi |
| 20884 | 20916 | if (type_is_invalid(ptr->value.type)) |
| 20885 | 20917 | return ira->codegen->invalid_instruction; |
| 20886 | 20918 | |
| 20887 | | ZigType *result_type = get_optional_type(ira->codegen, operand_type); |
| 20888 | | IrInstruction *result_loc; |
| 20889 | | if (handle_is_ptr(result_type)) { |
| 20890 | | result_loc = ir_resolve_result(ira, &instruction->base, instruction->result_loc, |
| 20891 | | result_type, nullptr); |
| 20892 | | if (type_is_invalid(result_loc->value.type) || instr_is_unreachable(result_loc)) { |
| 20893 | | return result_loc; |
| 20894 | | } |
| 20895 | | } else { |
| 20896 | | result_loc = nullptr; |
| 20897 | | } |
| 20898 | | |
| 20899 | 20919 | // TODO let this be volatile |
| 20900 | 20920 | ZigType *ptr_type = get_pointer_to_type(ira->codegen, operand_type, false); |
| 20901 | 20921 | IrInstruction *casted_ptr = ir_implicit_cast(ira, ptr, ptr_type); |
| ... | ... | @@ -20959,6 +20979,18 @@ static IrInstruction *ir_analyze_instruction_cmpxchg(IrAnalyze *ira, IrInstructi |
| 20959 | 20979 | zig_panic("TODO compile-time execution of cmpxchg"); |
| 20960 | 20980 | } |
| 20961 | 20981 | |
| 20982 | ZigType *result_type = get_optional_type(ira->codegen, operand_type); |
| 20983 | IrInstruction *result_loc; |
| 20984 | if (handle_is_ptr(result_type)) { |
| 20985 | result_loc = ir_resolve_result(ira, &instruction->base, instruction->result_loc, |
| 20986 | result_type, nullptr, true); |
| 20987 | if (type_is_invalid(result_loc->value.type) || instr_is_unreachable(result_loc)) { |
| 20988 | return result_loc; |
| 20989 | } |
| 20990 | } else { |
| 20991 | result_loc = nullptr; |
| 20992 | } |
| 20993 | |
| 20962 | 20994 | return ir_build_cmpxchg_gen(ira, &instruction->base, result_type, |
| 20963 | 20995 | casted_ptr, casted_cmp_value, casted_new_value, |
| 20964 | 20996 | success_order, failure_order, instruction->is_weak, result_loc); |
| ... | ... | @@ -21208,7 +21240,7 @@ static IrInstruction *ir_analyze_instruction_from_bytes(IrAnalyze *ira, IrInstru |
| 21208 | 21240 | } |
| 21209 | 21241 | |
| 21210 | 21242 | IrInstruction *result_loc = ir_resolve_result(ira, &instruction->base, instruction->result_loc, |
| 21211 | | dest_slice_type, nullptr); |
| 21243 | dest_slice_type, nullptr, true); |
| 21212 | 21244 | if (type_is_invalid(result_loc->value.type) || instr_is_unreachable(result_loc)) { |
| 21213 | 21245 | return result_loc; |
| 21214 | 21246 | } |
| ... | ... | @@ -21285,7 +21317,7 @@ static IrInstruction *ir_analyze_instruction_to_bytes(IrAnalyze *ira, IrInstruct |
| 21285 | 21317 | } |
| 21286 | 21318 | |
| 21287 | 21319 | IrInstruction *result_loc = ir_resolve_result(ira, &instruction->base, instruction->result_loc, |
| 21288 | | dest_slice_type, nullptr); |
| 21320 | dest_slice_type, nullptr, true); |
| 21289 | 21321 | if (type_is_invalid(result_loc->value.type) || instr_is_unreachable(result_loc)) { |
| 21290 | 21322 | return result_loc; |
| 21291 | 21323 | } |
| ... | ... | @@ -22027,7 +22059,7 @@ static IrInstruction *ir_analyze_instruction_slice(IrAnalyze *ira, IrInstruction |
| 22027 | 22059 | } |
| 22028 | 22060 | |
| 22029 | 22061 | IrInstruction *result_loc = ir_resolve_result(ira, &instruction->base, instruction->result_loc, |
| 22030 | | return_type, nullptr); |
| 22062 | return_type, nullptr, true); |
| 22031 | 22063 | if (type_is_invalid(result_loc->value.type) || instr_is_unreachable(result_loc)) { |
| 22032 | 22064 | return result_loc; |
| 22033 | 22065 | } |
| ... | ... | @@ -24461,7 +24493,7 @@ static IrInstruction *ir_analyze_instruction_end_expr(IrAnalyze *ira, IrInstruct |
| 24461 | 24493 | bool want_resolve_result = !instruction->result_loc->written; |
| 24462 | 24494 | if (want_resolve_result) { |
| 24463 | 24495 | IrInstruction *result_loc = ir_resolve_result(ira, &instruction->base, instruction->result_loc, |
| 24464 | | value->value.type, value); |
| 24496 | value->value.type, value, false); |
| 24465 | 24497 | if (result_loc != nullptr) { |
| 24466 | 24498 | if (type_is_invalid(result_loc->value.type)) |
| 24467 | 24499 | return ira->codegen->invalid_instruction; |
| ... | ... | @@ -24470,6 +24502,13 @@ static IrInstruction *ir_analyze_instruction_end_expr(IrAnalyze *ira, IrInstruct |
| 24470 | 24502 | |
| 24471 | 24503 | instruction->result_loc->written = true; |
| 24472 | 24504 | ir_analyze_store_ptr(ira, &instruction->base, result_loc, value); |
| 24505 | if (result_loc->value.data.x_ptr.mut == ConstPtrMutInfer) { |
| 24506 | if (instr_is_comptime(value)) { |
| 24507 | result_loc->value.data.x_ptr.mut = ConstPtrMutComptimeConst; |
| 24508 | } else { |
| 24509 | result_loc->value.special = ConstValSpecialRuntime; |
| 24510 | } |
| 24511 | } |
| 24473 | 24512 | } |
| 24474 | 24513 | } |
| 24475 | 24514 | |
| ... | ... | @@ -24482,7 +24521,7 @@ static IrInstruction *ir_analyze_instruction_bit_cast_src(IrAnalyze *ira, IrInst |
| 24482 | 24521 | return operand; |
| 24483 | 24522 | |
| 24484 | 24523 | IrInstruction *result_loc = ir_resolve_result(ira, &instruction->base, |
| 24485 | | &instruction->result_loc_bit_cast->base, operand->value.type, operand); |
| 24524 | &instruction->result_loc_bit_cast->base, operand->value.type, operand, false); |
| 24486 | 24525 | if (result_loc != nullptr && (type_is_invalid(result_loc->value.type) || instr_is_unreachable(result_loc))) |
| 24487 | 24526 | return result_loc; |
| 24488 | 24527 | |