| ... | ... | @@ -159,9 +159,9 @@ static ZigType *ir_resolve_atomic_operand_type(IrAnalyze *ira, IrInstruction *op |
| 159 | 159 | static IrInstruction *ir_lval_wrap(IrBuilder *irb, Scope *scope, IrInstruction *value, LVal lval); |
| 160 | 160 | static ZigType *adjust_ptr_align(CodeGen *g, ZigType *ptr_type, uint32_t new_align); |
| 161 | 161 | static ZigType *adjust_slice_align(CodeGen *g, ZigType *slice_type, uint32_t new_align); |
| 162 | | static Error buf_read_value_bytes(IrAnalyze *ira, AstNode *source_node, uint8_t *buf, ConstExprValue *val); |
| 162 | static Error buf_read_value_bytes(IrAnalyze *ira, CodeGen *codegen, AstNode *source_node, uint8_t *buf, ConstExprValue *val); |
| 163 | 163 | static void buf_write_value_bytes(CodeGen *codegen, uint8_t *buf, ConstExprValue *val); |
| 164 | | static Error ir_read_const_ptr(IrAnalyze *ira, AstNode *source_node, |
| 164 | static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source_node, |
| 165 | 165 | ConstExprValue *out_val, ConstExprValue *ptr_val); |
| 166 | 166 | static IrInstruction *ir_analyze_ptr_cast(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *ptr, |
| 167 | 167 | ZigType *dest_type, IrInstruction *dest_type_src); |
| ... | ... | @@ -7391,35 +7391,46 @@ static ErrorMsg *ir_add_error_node(IrAnalyze *ira, AstNode *source_node, Buf *ms |
| 7391 | 7391 | return exec_add_error_node(ira->codegen, ira->new_irb.exec, source_node, msg); |
| 7392 | 7392 | } |
| 7393 | 7393 | |
| 7394 | static ErrorMsg *opt_ir_add_error_node(IrAnalyze *ira, CodeGen *codegen, AstNode *source_node, Buf *msg) { |
| 7395 | if (ira != nullptr) |
| 7396 | return exec_add_error_node(codegen, ira->new_irb.exec, source_node, msg); |
| 7397 | else |
| 7398 | return add_node_error(codegen, source_node, msg); |
| 7399 | } |
| 7400 | |
| 7394 | 7401 | static ErrorMsg *ir_add_error(IrAnalyze *ira, IrInstruction *source_instruction, Buf *msg) { |
| 7395 | 7402 | return ir_add_error_node(ira, source_instruction->source_node, msg); |
| 7396 | 7403 | } |
| 7397 | 7404 | |
| 7398 | 7405 | // This function takes a comptime ptr and makes the child const value conform to the type |
| 7399 | 7406 | // described by the pointer. |
| 7400 | | static Error eval_comptime_ptr_reinterpret(IrAnalyze *ira, AstNode *source_node, ConstExprValue *ptr_val) { |
| 7407 | static Error eval_comptime_ptr_reinterpret(IrAnalyze *ira, CodeGen *codegen, AstNode *source_node, |
| 7408 | ConstExprValue *ptr_val) |
| 7409 | { |
| 7401 | 7410 | Error err; |
| 7402 | 7411 | assert(ptr_val->type->id == ZigTypeIdPointer); |
| 7403 | 7412 | ConstExprValue tmp = {}; |
| 7404 | 7413 | tmp.special = ConstValSpecialStatic; |
| 7405 | 7414 | tmp.type = ptr_val->type->data.pointer.child_type; |
| 7406 | | if ((err = ir_read_const_ptr(ira, source_node, &tmp, ptr_val))) |
| 7415 | if ((err = ir_read_const_ptr(ira, codegen, source_node, &tmp, ptr_val))) |
| 7407 | 7416 | return err; |
| 7408 | | ConstExprValue *child_val = const_ptr_pointee_unchecked(ira->codegen, ptr_val); |
| 7417 | ConstExprValue *child_val = const_ptr_pointee_unchecked(codegen, ptr_val); |
| 7409 | 7418 | copy_const_val(child_val, &tmp, false); |
| 7410 | 7419 | return ErrorNone; |
| 7411 | 7420 | } |
| 7412 | 7421 | |
| 7413 | | static ConstExprValue *ir_const_ptr_pointee(IrAnalyze *ira, ConstExprValue *const_val, AstNode *source_node) { |
| 7422 | ConstExprValue *const_ptr_pointee(IrAnalyze *ira, CodeGen *codegen, ConstExprValue *const_val, |
| 7423 | AstNode *source_node) |
| 7424 | { |
| 7414 | 7425 | Error err; |
| 7415 | | ConstExprValue *val = const_ptr_pointee_unchecked(ira->codegen, const_val); |
| 7426 | ConstExprValue *val = const_ptr_pointee_unchecked(codegen, const_val); |
| 7416 | 7427 | assert(val != nullptr); |
| 7417 | 7428 | assert(const_val->type->id == ZigTypeIdPointer); |
| 7418 | 7429 | ZigType *expected_type = const_val->type->data.pointer.child_type; |
| 7419 | 7430 | if (!types_have_same_zig_comptime_repr(val->type, expected_type)) { |
| 7420 | | if ((err = eval_comptime_ptr_reinterpret(ira, source_node, const_val))) |
| 7431 | if ((err = eval_comptime_ptr_reinterpret(ira, codegen, source_node, const_val))) |
| 7421 | 7432 | return nullptr; |
| 7422 | | return const_ptr_pointee_unchecked(ira->codegen, const_val); |
| 7433 | return const_ptr_pointee_unchecked(codegen, const_val); |
| 7423 | 7434 | } |
| 7424 | 7435 | return val; |
| 7425 | 7436 | } |
| ... | ... | @@ -9461,7 +9472,7 @@ static IrInstruction *ir_resolve_ptr_of_array_to_unknown_len_ptr(IrAnalyze *ira, |
| 9461 | 9472 | wanted_type = adjust_ptr_align(ira->codegen, wanted_type, get_ptr_align(ira->codegen, value->value.type)); |
| 9462 | 9473 | |
| 9463 | 9474 | if (instr_is_comptime(value)) { |
| 9464 | | ConstExprValue *pointee = ir_const_ptr_pointee(ira, &value->value, source_instr->source_node); |
| 9475 | ConstExprValue *pointee = const_ptr_pointee(ira, ira->codegen, &value->value, source_instr->source_node); |
| 9465 | 9476 | if (pointee == nullptr) |
| 9466 | 9477 | return ira->codegen->invalid_instruction; |
| 9467 | 9478 | if (pointee->special != ConstValSpecialRuntime) { |
| ... | ... | @@ -9497,7 +9508,7 @@ static IrInstruction *ir_resolve_ptr_of_array_to_slice(IrAnalyze *ira, IrInstruc |
| 9497 | 9508 | wanted_type = adjust_slice_align(ira->codegen, wanted_type, get_ptr_align(ira->codegen, value->value.type)); |
| 9498 | 9509 | |
| 9499 | 9510 | if (instr_is_comptime(value)) { |
| 9500 | | ConstExprValue *pointee = ir_const_ptr_pointee(ira, &value->value, source_instr->source_node); |
| 9511 | ConstExprValue *pointee = const_ptr_pointee(ira, ira->codegen, &value->value, source_instr->source_node); |
| 9501 | 9512 | if (pointee == nullptr) |
| 9502 | 9513 | return ira->codegen->invalid_instruction; |
| 9503 | 9514 | if (pointee->special != ConstValSpecialRuntime) { |
| ... | ... | @@ -10456,7 +10467,7 @@ static IrInstruction *ir_analyze_ptr_to_array(IrAnalyze *ira, IrInstruction *sou |
| 10456 | 10467 | return ira->codegen->invalid_instruction; |
| 10457 | 10468 | |
| 10458 | 10469 | assert(val->type->id == ZigTypeIdPointer); |
| 10459 | | ConstExprValue *pointee = ir_const_ptr_pointee(ira, val, source_instr->source_node); |
| 10470 | ConstExprValue *pointee = const_ptr_pointee(ira, ira->codegen, val, source_instr->source_node); |
| 10460 | 10471 | if (pointee == nullptr) |
| 10461 | 10472 | return ira->codegen->invalid_instruction; |
| 10462 | 10473 | if (pointee->special != ConstValSpecialRuntime) { |
| ... | ... | @@ -11025,7 +11036,7 @@ static IrInstruction *ir_get_deref(IrAnalyze *ira, IrInstruction *source_instruc |
| 11025 | 11036 | IrInstruction *result = ir_create_const(&ira->new_irb, source_instruction->scope, |
| 11026 | 11037 | source_instruction->source_node, child_type); |
| 11027 | 11038 | |
| 11028 | | if ((err = ir_read_const_ptr(ira, source_instruction->source_node, &result->value, |
| 11039 | if ((err = ir_read_const_ptr(ira, ira->codegen, source_instruction->source_node, &result->value, |
| 11029 | 11040 | &ptr->value))) |
| 11030 | 11041 | { |
| 11031 | 11042 | return ira->codegen->invalid_instruction; |
| ... | ... | @@ -13730,21 +13741,21 @@ static IrInstruction *ir_analyze_instruction_call(IrAnalyze *ira, IrInstructionC |
| 13730 | 13741 | |
| 13731 | 13742 | // out_val->type must be the type to read the pointer as |
| 13732 | 13743 | // if the type is different than the actual type then it does a comptime byte reinterpretation |
| 13733 | | static Error ir_read_const_ptr(IrAnalyze *ira, AstNode *source_node, |
| 13744 | static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source_node, |
| 13734 | 13745 | ConstExprValue *out_val, ConstExprValue *ptr_val) |
| 13735 | 13746 | { |
| 13736 | 13747 | Error err; |
| 13737 | 13748 | assert(out_val->type != nullptr); |
| 13738 | 13749 | |
| 13739 | | ConstExprValue *pointee = const_ptr_pointee_unchecked(ira->codegen, ptr_val); |
| 13750 | ConstExprValue *pointee = const_ptr_pointee_unchecked(codegen, ptr_val); |
| 13740 | 13751 | |
| 13741 | | if ((err = type_resolve(ira->codegen, pointee->type, ResolveStatusSizeKnown))) |
| 13752 | if ((err = type_resolve(codegen, pointee->type, ResolveStatusSizeKnown))) |
| 13742 | 13753 | return ErrorSemanticAnalyzeFail; |
| 13743 | | if ((err = type_resolve(ira->codegen, out_val->type, ResolveStatusSizeKnown))) |
| 13754 | if ((err = type_resolve(codegen, out_val->type, ResolveStatusSizeKnown))) |
| 13744 | 13755 | return ErrorSemanticAnalyzeFail; |
| 13745 | 13756 | |
| 13746 | | size_t src_size = type_size(ira->codegen, pointee->type); |
| 13747 | | size_t dst_size = type_size(ira->codegen, out_val->type); |
| 13757 | size_t src_size = type_size(codegen, pointee->type); |
| 13758 | size_t dst_size = type_size(codegen, out_val->type); |
| 13748 | 13759 | |
| 13749 | 13760 | if (src_size == dst_size && types_have_same_zig_comptime_repr(pointee->type, out_val->type)) { |
| 13750 | 13761 | copy_const_val(out_val, pointee, ptr_val->data.x_ptr.mut == ConstPtrMutComptimeConst); |
| ... | ... | @@ -13754,8 +13765,8 @@ static Error ir_read_const_ptr(IrAnalyze *ira, AstNode *source_node, |
| 13754 | 13765 | if (dst_size <= src_size) { |
| 13755 | 13766 | Buf buf = BUF_INIT; |
| 13756 | 13767 | buf_resize(&buf, src_size); |
| 13757 | | buf_write_value_bytes(ira->codegen, (uint8_t*)buf_ptr(&buf), pointee); |
| 13758 | | if ((err = buf_read_value_bytes(ira, source_node, (uint8_t*)buf_ptr(&buf), out_val))) |
| 13768 | buf_write_value_bytes(codegen, (uint8_t*)buf_ptr(&buf), pointee); |
| 13769 | if ((err = buf_read_value_bytes(ira, codegen, source_node, (uint8_t*)buf_ptr(&buf), out_val))) |
| 13759 | 13770 | return err; |
| 13760 | 13771 | return ErrorNone; |
| 13761 | 13772 | } |
| ... | ... | @@ -13764,7 +13775,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, AstNode *source_node, |
| 13764 | 13775 | case ConstPtrSpecialInvalid: |
| 13765 | 13776 | zig_unreachable(); |
| 13766 | 13777 | case ConstPtrSpecialRef: { |
| 13767 | | ir_add_error_node(ira, source_node, |
| 13778 | opt_ir_add_error_node(ira, codegen, source_node, |
| 13768 | 13779 | buf_sprintf("attempt to read %zu bytes from pointer to %s which is %zu bytes", |
| 13769 | 13780 | dst_size, buf_ptr(&pointee->type->name), src_size)); |
| 13770 | 13781 | return ErrorSemanticAnalyzeFail; |
| ... | ... | @@ -13778,7 +13789,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, AstNode *source_node, |
| 13778 | 13789 | size_t elem_index = ptr_val->data.x_ptr.data.base_array.elem_index; |
| 13779 | 13790 | src_size = elem_size * (array_val->type->data.array.len - elem_index); |
| 13780 | 13791 | if (dst_size > src_size) { |
| 13781 | | ir_add_error_node(ira, source_node, |
| 13792 | opt_ir_add_error_node(ira, codegen, source_node, |
| 13782 | 13793 | buf_sprintf("attempt to read %zu bytes from %s at index %" ZIG_PRI_usize " which is %zu bytes", |
| 13783 | 13794 | dst_size, buf_ptr(&array_val->type->name), elem_index, src_size)); |
| 13784 | 13795 | return ErrorSemanticAnalyzeFail; |
| ... | ... | @@ -13788,9 +13799,9 @@ static Error ir_read_const_ptr(IrAnalyze *ira, AstNode *source_node, |
| 13788 | 13799 | buf_resize(&buf, elem_count * elem_size); |
| 13789 | 13800 | for (size_t i = 0; i < elem_count; i += 1) { |
| 13790 | 13801 | ConstExprValue *elem_val = &array_val->data.x_array.data.s_none.elements[elem_index + i]; |
| 13791 | | buf_write_value_bytes(ira->codegen, (uint8_t*)buf_ptr(&buf) + (i * elem_size), elem_val); |
| 13802 | buf_write_value_bytes(codegen, (uint8_t*)buf_ptr(&buf) + (i * elem_size), elem_val); |
| 13792 | 13803 | } |
| 13793 | | if ((err = buf_read_value_bytes(ira, source_node, (uint8_t*)buf_ptr(&buf), out_val))) |
| 13804 | if ((err = buf_read_value_bytes(ira, codegen, source_node, (uint8_t*)buf_ptr(&buf), out_val))) |
| 13794 | 13805 | return err; |
| 13795 | 13806 | return ErrorNone; |
| 13796 | 13807 | } |
| ... | ... | @@ -14227,7 +14238,7 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct |
| 14227 | 14238 | array_type = array_type->data.pointer.child_type; |
| 14228 | 14239 | ptr_type = ptr_type->data.pointer.child_type; |
| 14229 | 14240 | if (orig_array_ptr_val->special != ConstValSpecialRuntime) { |
| 14230 | | orig_array_ptr_val = ir_const_ptr_pointee(ira, orig_array_ptr_val, |
| 14241 | orig_array_ptr_val = const_ptr_pointee(ira, ira->codegen, orig_array_ptr_val, |
| 14231 | 14242 | elem_ptr_instruction->base.source_node); |
| 14232 | 14243 | if (orig_array_ptr_val == nullptr) |
| 14233 | 14244 | return ira->codegen->invalid_instruction; |
| ... | ... | @@ -14271,7 +14282,7 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct |
| 14271 | 14282 | ConstExprValue *ptr_val = ir_resolve_const(ira, array_ptr, UndefBad); |
| 14272 | 14283 | if (!ptr_val) |
| 14273 | 14284 | return ira->codegen->invalid_instruction; |
| 14274 | | ConstExprValue *args_val = ir_const_ptr_pointee(ira, ptr_val, elem_ptr_instruction->base.source_node); |
| 14285 | ConstExprValue *args_val = const_ptr_pointee(ira, ira->codegen, ptr_val, elem_ptr_instruction->base.source_node); |
| 14275 | 14286 | if (args_val == nullptr) |
| 14276 | 14287 | return ira->codegen->invalid_instruction; |
| 14277 | 14288 | size_t start = args_val->data.x_arg_tuple.start_index; |
| ... | ... | @@ -14353,7 +14364,7 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct |
| 14353 | 14364 | (orig_array_ptr_val->data.x_ptr.mut != ConstPtrMutRuntimeVar || |
| 14354 | 14365 | array_type->id == ZigTypeIdArray)) |
| 14355 | 14366 | { |
| 14356 | | ConstExprValue *array_ptr_val = ir_const_ptr_pointee(ira, orig_array_ptr_val, |
| 14367 | ConstExprValue *array_ptr_val = const_ptr_pointee(ira, ira->codegen, orig_array_ptr_val, |
| 14357 | 14368 | elem_ptr_instruction->base.source_node); |
| 14358 | 14369 | if (array_ptr_val == nullptr) |
| 14359 | 14370 | return ira->codegen->invalid_instruction; |
| ... | ... | @@ -14572,7 +14583,7 @@ static IrInstruction *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field_ |
| 14572 | 14583 | return ira->codegen->invalid_instruction; |
| 14573 | 14584 | |
| 14574 | 14585 | if (ptr_val->data.x_ptr.special != ConstPtrSpecialHardCodedAddr) { |
| 14575 | | ConstExprValue *struct_val = ir_const_ptr_pointee(ira, ptr_val, source_instr->source_node); |
| 14586 | ConstExprValue *struct_val = const_ptr_pointee(ira, ira->codegen, ptr_val, source_instr->source_node); |
| 14576 | 14587 | if (struct_val == nullptr) |
| 14577 | 14588 | return ira->codegen->invalid_instruction; |
| 14578 | 14589 | if (type_is_invalid(struct_val->type)) |
| ... | ... | @@ -14614,7 +14625,7 @@ static IrInstruction *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field_ |
| 14614 | 14625 | return ira->codegen->invalid_instruction; |
| 14615 | 14626 | |
| 14616 | 14627 | if (ptr_val->data.x_ptr.special != ConstPtrSpecialHardCodedAddr) { |
| 14617 | | ConstExprValue *union_val = ir_const_ptr_pointee(ira, ptr_val, source_instr->source_node); |
| 14628 | ConstExprValue *union_val = const_ptr_pointee(ira, ira->codegen, ptr_val, source_instr->source_node); |
| 14618 | 14629 | if (union_val == nullptr) |
| 14619 | 14630 | return ira->codegen->invalid_instruction; |
| 14620 | 14631 | if (type_is_invalid(union_val->type)) |
| ... | ... | @@ -14811,7 +14822,7 @@ static IrInstruction *ir_analyze_instruction_field_ptr(IrAnalyze *ira, IrInstruc |
| 14811 | 14822 | return ira->codegen->invalid_instruction; |
| 14812 | 14823 | |
| 14813 | 14824 | assert(container_ptr->value.type->id == ZigTypeIdPointer); |
| 14814 | | ConstExprValue *child_val = ir_const_ptr_pointee(ira, container_ptr_val, source_node); |
| 14825 | ConstExprValue *child_val = const_ptr_pointee(ira, ira->codegen, container_ptr_val, source_node); |
| 14815 | 14826 | if (child_val == nullptr) |
| 14816 | 14827 | return ira->codegen->invalid_instruction; |
| 14817 | 14828 | |
| ... | ... | @@ -14837,7 +14848,7 @@ static IrInstruction *ir_analyze_instruction_field_ptr(IrAnalyze *ira, IrInstruc |
| 14837 | 14848 | return ira->codegen->invalid_instruction; |
| 14838 | 14849 | |
| 14839 | 14850 | assert(container_ptr->value.type->id == ZigTypeIdPointer); |
| 14840 | | ConstExprValue *child_val = ir_const_ptr_pointee(ira, container_ptr_val, source_node); |
| 14851 | ConstExprValue *child_val = const_ptr_pointee(ira, ira->codegen, container_ptr_val, source_node); |
| 14841 | 14852 | if (child_val == nullptr) |
| 14842 | 14853 | return ira->codegen->invalid_instruction; |
| 14843 | 14854 | ZigType *child_type = child_val->data.x_type; |
| ... | ... | @@ -15112,7 +15123,7 @@ static IrInstruction *ir_analyze_instruction_field_ptr(IrAnalyze *ira, IrInstruc |
| 15112 | 15123 | if (!container_ptr_val) |
| 15113 | 15124 | return ira->codegen->invalid_instruction; |
| 15114 | 15125 | |
| 15115 | | ConstExprValue *namespace_val = ir_const_ptr_pointee(ira, container_ptr_val, |
| 15126 | ConstExprValue *namespace_val = const_ptr_pointee(ira, ira->codegen, container_ptr_val, |
| 15116 | 15127 | field_ptr_instruction->base.source_node); |
| 15117 | 15128 | if (namespace_val == nullptr) |
| 15118 | 15129 | return ira->codegen->invalid_instruction; |
| ... | ... | @@ -15187,7 +15198,7 @@ static IrInstruction *ir_analyze_instruction_store_ptr(IrAnalyze *ira, IrInstruc |
| 15187 | 15198 | } |
| 15188 | 15199 | if (ptr->value.data.x_ptr.mut == ConstPtrMutComptimeVar) { |
| 15189 | 15200 | if (instr_is_comptime(casted_value)) { |
| 15190 | | ConstExprValue *dest_val = ir_const_ptr_pointee(ira, &ptr->value, store_ptr_instruction->base.source_node); |
| 15201 | ConstExprValue *dest_val = const_ptr_pointee(ira, ira->codegen, &ptr->value, store_ptr_instruction->base.source_node); |
| 15191 | 15202 | if (dest_val == nullptr) |
| 15192 | 15203 | return ira->codegen->invalid_instruction; |
| 15193 | 15204 | if (dest_val->special != ConstValSpecialRuntime) { |
| ... | ... | @@ -15735,7 +15746,7 @@ static IrInstruction *ir_analyze_instruction_unwrap_maybe(IrAnalyze *ira, |
| 15735 | 15746 | ConstExprValue *val = ir_resolve_const(ira, value, UndefBad); |
| 15736 | 15747 | if (!val) |
| 15737 | 15748 | return ira->codegen->invalid_instruction; |
| 15738 | | ConstExprValue *maybe_val = ir_const_ptr_pointee(ira, val, unwrap_maybe_instruction->base.source_node); |
| 15749 | ConstExprValue *maybe_val = const_ptr_pointee(ira, ira->codegen, val, unwrap_maybe_instruction->base.source_node); |
| 15739 | 15750 | if (maybe_val == nullptr) |
| 15740 | 15751 | return ira->codegen->invalid_instruction; |
| 15741 | 15752 | |
| ... | ... | @@ -16032,7 +16043,7 @@ static IrInstruction *ir_analyze_instruction_switch_target(IrAnalyze *ira, |
| 16032 | 16043 | ZigType *target_type = target_value_ptr->value.type->data.pointer.child_type; |
| 16033 | 16044 | ConstExprValue *pointee_val = nullptr; |
| 16034 | 16045 | if (instr_is_comptime(target_value_ptr)) { |
| 16035 | | pointee_val = ir_const_ptr_pointee(ira, &target_value_ptr->value, target_value_ptr->source_node); |
| 16046 | pointee_val = const_ptr_pointee(ira, ira->codegen, &target_value_ptr->value, target_value_ptr->source_node); |
| 16036 | 16047 | if (pointee_val == nullptr) |
| 16037 | 16048 | return ira->codegen->invalid_instruction; |
| 16038 | 16049 | |
| ... | ... | @@ -16167,7 +16178,7 @@ static IrInstruction *ir_analyze_instruction_switch_var(IrAnalyze *ira, IrInstru |
| 16167 | 16178 | if (!target_value_ptr) |
| 16168 | 16179 | return ira->codegen->invalid_instruction; |
| 16169 | 16180 | |
| 16170 | | ConstExprValue *pointee_val = ir_const_ptr_pointee(ira, target_val_ptr, instruction->base.source_node); |
| 16181 | ConstExprValue *pointee_val = const_ptr_pointee(ira, ira->codegen, target_val_ptr, instruction->base.source_node); |
| 16171 | 16182 | if (pointee_val == nullptr) |
| 16172 | 16183 | return ira->codegen->invalid_instruction; |
| 16173 | 16184 | |
| ... | ... | @@ -18882,18 +18893,18 @@ static IrInstruction *ir_analyze_instruction_slice(IrAnalyze *ira, IrInstruction |
| 18882 | 18893 | if (array_type->id == ZigTypeIdPointer) { |
| 18883 | 18894 | ZigType *child_array_type = array_type->data.pointer.child_type; |
| 18884 | 18895 | assert(child_array_type->id == ZigTypeIdArray); |
| 18885 | | parent_ptr = ir_const_ptr_pointee(ira, &ptr_ptr->value, instruction->base.source_node); |
| 18896 | parent_ptr = const_ptr_pointee(ira, ira->codegen, &ptr_ptr->value, instruction->base.source_node); |
| 18886 | 18897 | if (parent_ptr == nullptr) |
| 18887 | 18898 | return ira->codegen->invalid_instruction; |
| 18888 | 18899 | |
| 18889 | | array_val = ir_const_ptr_pointee(ira, parent_ptr, instruction->base.source_node); |
| 18900 | array_val = const_ptr_pointee(ira, ira->codegen, parent_ptr, instruction->base.source_node); |
| 18890 | 18901 | if (array_val == nullptr) |
| 18891 | 18902 | return ira->codegen->invalid_instruction; |
| 18892 | 18903 | |
| 18893 | 18904 | rel_end = child_array_type->data.array.len; |
| 18894 | 18905 | abs_offset = 0; |
| 18895 | 18906 | } else { |
| 18896 | | array_val = ir_const_ptr_pointee(ira, &ptr_ptr->value, instruction->base.source_node); |
| 18907 | array_val = const_ptr_pointee(ira, ira->codegen, &ptr_ptr->value, instruction->base.source_node); |
| 18897 | 18908 | if (array_val == nullptr) |
| 18898 | 18909 | return ira->codegen->invalid_instruction; |
| 18899 | 18910 | rel_end = array_type->data.array.len; |
| ... | ... | @@ -18902,7 +18913,7 @@ static IrInstruction *ir_analyze_instruction_slice(IrAnalyze *ira, IrInstruction |
| 18902 | 18913 | } |
| 18903 | 18914 | } else if (array_type->id == ZigTypeIdPointer) { |
| 18904 | 18915 | assert(array_type->data.pointer.ptr_len == PtrLenUnknown); |
| 18905 | | parent_ptr = ir_const_ptr_pointee(ira, &ptr_ptr->value, instruction->base.source_node); |
| 18916 | parent_ptr = const_ptr_pointee(ira, ira->codegen, &ptr_ptr->value, instruction->base.source_node); |
| 18906 | 18917 | if (parent_ptr == nullptr) |
| 18907 | 18918 | return ira->codegen->invalid_instruction; |
| 18908 | 18919 | |
| ... | ... | @@ -18942,7 +18953,7 @@ static IrInstruction *ir_analyze_instruction_slice(IrAnalyze *ira, IrInstruction |
| 18942 | 18953 | zig_panic("TODO slice of ptr cast from function"); |
| 18943 | 18954 | } |
| 18944 | 18955 | } else if (is_slice(array_type)) { |
| 18945 | | ConstExprValue *slice_ptr = ir_const_ptr_pointee(ira, &ptr_ptr->value, instruction->base.source_node); |
| 18956 | ConstExprValue *slice_ptr = const_ptr_pointee(ira, ira->codegen, &ptr_ptr->value, instruction->base.source_node); |
| 18946 | 18957 | if (slice_ptr == nullptr) |
| 18947 | 18958 | return ira->codegen->invalid_instruction; |
| 18948 | 18959 | |
| ... | ... | @@ -19351,7 +19362,7 @@ static IrInstruction *ir_analyze_instruction_overflow_op(IrAnalyze *ira, IrInstr |
| 19351 | 19362 | { |
| 19352 | 19363 | BigInt *op1_bigint = &casted_op1->value.data.x_bigint; |
| 19353 | 19364 | BigInt *op2_bigint = &casted_op2->value.data.x_bigint; |
| 19354 | | ConstExprValue *pointee_val = ir_const_ptr_pointee(ira, &casted_result_ptr->value, casted_result_ptr->source_node); |
| 19365 | ConstExprValue *pointee_val = const_ptr_pointee(ira, ira->codegen, &casted_result_ptr->value, casted_result_ptr->source_node); |
| 19355 | 19366 | if (pointee_val == nullptr) |
| 19356 | 19367 | return ira->codegen->invalid_instruction; |
| 19357 | 19368 | BigInt *dest_bigint = &pointee_val->data.x_bigint; |
| ... | ... | @@ -19450,7 +19461,7 @@ static IrInstruction *ir_analyze_instruction_unwrap_err_code(IrAnalyze *ira, |
| 19450 | 19461 | ConstExprValue *ptr_val = ir_resolve_const(ira, value, UndefBad); |
| 19451 | 19462 | if (!ptr_val) |
| 19452 | 19463 | return ira->codegen->invalid_instruction; |
| 19453 | | ConstExprValue *err_union_val = ir_const_ptr_pointee(ira, ptr_val, instruction->base.source_node); |
| 19464 | ConstExprValue *err_union_val = const_ptr_pointee(ira, ira->codegen, ptr_val, instruction->base.source_node); |
| 19454 | 19465 | if (err_union_val == nullptr) |
| 19455 | 19466 | return ira->codegen->invalid_instruction; |
| 19456 | 19467 | if (err_union_val->special != ConstValSpecialRuntime) { |
| ... | ... | @@ -19502,7 +19513,7 @@ static IrInstruction *ir_analyze_instruction_unwrap_err_payload(IrAnalyze *ira, |
| 19502 | 19513 | ConstExprValue *ptr_val = ir_resolve_const(ira, value, UndefBad); |
| 19503 | 19514 | if (!ptr_val) |
| 19504 | 19515 | return ira->codegen->invalid_instruction; |
| 19505 | | ConstExprValue *err_union_val = ir_const_ptr_pointee(ira, ptr_val, instruction->base.source_node); |
| 19516 | ConstExprValue *err_union_val = const_ptr_pointee(ira, ira->codegen, ptr_val, instruction->base.source_node); |
| 19506 | 19517 | if (err_union_val == nullptr) |
| 19507 | 19518 | return ira->codegen->invalid_instruction; |
| 19508 | 19519 | if (err_union_val->special != ConstValSpecialRuntime) { |
| ... | ... | @@ -20132,7 +20143,7 @@ static void buf_write_value_bytes(CodeGen *codegen, uint8_t *buf, ConstExprValue |
| 20132 | 20143 | zig_unreachable(); |
| 20133 | 20144 | } |
| 20134 | 20145 | |
| 20135 | | static Error buf_read_value_bytes(IrAnalyze *ira, AstNode *source_node, uint8_t *buf, ConstExprValue *val) { |
| 20146 | static Error buf_read_value_bytes(IrAnalyze *ira, CodeGen *codegen, AstNode *source_node, uint8_t *buf, ConstExprValue *val) { |
| 20136 | 20147 | Error err; |
| 20137 | 20148 | assert(val->special == ConstValSpecialStatic); |
| 20138 | 20149 | switch (val->type->id) { |
| ... | ... | @@ -20156,22 +20167,22 @@ static Error buf_read_value_bytes(IrAnalyze *ira, AstNode *source_node, uint8_t |
| 20156 | 20167 | return ErrorNone; |
| 20157 | 20168 | case ZigTypeIdInt: |
| 20158 | 20169 | bigint_read_twos_complement(&val->data.x_bigint, buf, val->type->data.integral.bit_count, |
| 20159 | | ira->codegen->is_big_endian, val->type->data.integral.is_signed); |
| 20170 | codegen->is_big_endian, val->type->data.integral.is_signed); |
| 20160 | 20171 | return ErrorNone; |
| 20161 | 20172 | case ZigTypeIdFloat: |
| 20162 | | float_read_ieee597(val, buf, ira->codegen->is_big_endian); |
| 20173 | float_read_ieee597(val, buf, codegen->is_big_endian); |
| 20163 | 20174 | return ErrorNone; |
| 20164 | 20175 | case ZigTypeIdPointer: |
| 20165 | 20176 | { |
| 20166 | 20177 | val->data.x_ptr.special = ConstPtrSpecialHardCodedAddr; |
| 20167 | 20178 | BigInt bn; |
| 20168 | | bigint_read_twos_complement(&bn, buf, ira->codegen->builtin_types.entry_usize->data.integral.bit_count, |
| 20169 | | ira->codegen->is_big_endian, false); |
| 20179 | bigint_read_twos_complement(&bn, buf, codegen->builtin_types.entry_usize->data.integral.bit_count, |
| 20180 | codegen->is_big_endian, false); |
| 20170 | 20181 | val->data.x_ptr.data.hard_coded_addr.addr = bigint_as_unsigned(&bn); |
| 20171 | 20182 | return ErrorNone; |
| 20172 | 20183 | } |
| 20173 | 20184 | case ZigTypeIdArray: { |
| 20174 | | uint64_t elem_size = type_size(ira->codegen, val->type->data.array.child_type); |
| 20185 | uint64_t elem_size = type_size(codegen, val->type->data.array.child_type); |
| 20175 | 20186 | size_t len = val->type->data.array.len; |
| 20176 | 20187 | |
| 20177 | 20188 | switch (val->data.x_array.special) { |
| ... | ... | @@ -20181,7 +20192,7 @@ static Error buf_read_value_bytes(IrAnalyze *ira, AstNode *source_node, uint8_t |
| 20181 | 20192 | ConstExprValue *elem = &val->data.x_array.data.s_none.elements[i]; |
| 20182 | 20193 | elem->special = ConstValSpecialStatic; |
| 20183 | 20194 | elem->type = val->type->data.array.child_type; |
| 20184 | | if ((err = buf_read_value_bytes(ira, source_node, buf + (elem_size * i), elem))) |
| 20195 | if ((err = buf_read_value_bytes(ira, codegen, source_node, buf + (elem_size * i), elem))) |
| 20185 | 20196 | return err; |
| 20186 | 20197 | } |
| 20187 | 20198 | break; |
| ... | ... | @@ -20196,10 +20207,10 @@ static Error buf_read_value_bytes(IrAnalyze *ira, AstNode *source_node, uint8_t |
| 20196 | 20207 | case ZigTypeIdStruct: |
| 20197 | 20208 | switch (val->type->data.structure.layout) { |
| 20198 | 20209 | case ContainerLayoutAuto: { |
| 20199 | | ErrorMsg *msg = ir_add_error_node(ira, source_node, |
| 20210 | ErrorMsg *msg = opt_ir_add_error_node(ira, codegen, source_node, |
| 20200 | 20211 | buf_sprintf("non-extern, non-packed struct '%s' cannot have its bytes reinterpreted", |
| 20201 | 20212 | buf_ptr(&val->type->name))); |
| 20202 | | add_error_note(ira->codegen, msg, val->type->data.structure.decl_node, |
| 20213 | add_error_note(codegen, msg, val->type->data.structure.decl_node, |
| 20203 | 20214 | buf_sprintf("declared here")); |
| 20204 | 20215 | return ErrorSemanticAnalyzeFail; |
| 20205 | 20216 | } |
| ... | ... | @@ -20213,10 +20224,10 @@ static Error buf_read_value_bytes(IrAnalyze *ira, AstNode *source_node, uint8_t |
| 20213 | 20224 | field_val->type = type_field->type_entry; |
| 20214 | 20225 | if (type_field->gen_index == SIZE_MAX) |
| 20215 | 20226 | continue; |
| 20216 | | size_t offset = LLVMOffsetOfElement(ira->codegen->target_data_ref, val->type->type_ref, |
| 20227 | size_t offset = LLVMOffsetOfElement(codegen->target_data_ref, val->type->type_ref, |
| 20217 | 20228 | type_field->gen_index); |
| 20218 | 20229 | uint8_t *new_buf = buf + offset; |
| 20219 | | if ((err = buf_read_value_bytes(ira, source_node, new_buf, field_val))) |
| 20230 | if ((err = buf_read_value_bytes(ira, codegen, source_node, new_buf, field_val))) |
| 20220 | 20231 | return err; |
| 20221 | 20232 | } |
| 20222 | 20233 | return ErrorNone; |
| ... | ... | @@ -20327,7 +20338,7 @@ static IrInstruction *ir_analyze_instruction_bit_cast(IrAnalyze *ira, IrInstruct |
| 20327 | 20338 | IrInstruction *result = ir_const(ira, &instruction->base, dest_type); |
| 20328 | 20339 | uint8_t *buf = allocate_nonzero<uint8_t>(src_size_bytes); |
| 20329 | 20340 | buf_write_value_bytes(ira->codegen, buf, val); |
| 20330 | | if ((err = buf_read_value_bytes(ira, instruction->base.source_node, buf, &result->value))) |
| 20341 | if ((err = buf_read_value_bytes(ira, ira->codegen, instruction->base.source_node, buf, &result->value))) |
| 20331 | 20342 | return ira->codegen->invalid_instruction; |
| 20332 | 20343 | return result; |
| 20333 | 20344 | } |