authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-14 11:01:38-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-14 11:01:38-04:00
log2ba29a1907264d6466f187cd89552a63160d3922
tree05c4aa2c024529062a86c282ff32338c96230ae0
parentfdaca1b5f3b7b72ed3a661bc52b6463838f366c4
signature Commit is signed but in an unrecognized format.

fix peer result location with error code and payload


4 files changed, 59 insertions(+), 24 deletions(-)

src/all_types.hpp+1
...@@ -3099,6 +3099,7 @@ struct IrInstructionTestErr {...@@ -3099,6 +3099,7 @@ struct IrInstructionTestErr {
3099struct IrInstructionUnwrapErrCode {3099struct IrInstructionUnwrapErrCode {
3100 IrInstruction base;3100 IrInstruction base;
31013101
3102 bool initializing;
3102 IrInstruction *err_union_ptr;3103 IrInstruction *err_union_ptr;
3103};3104};
31043105
src/codegen.cpp+1
...@@ -4901,6 +4901,7 @@ static LLVMValueRef ir_render_unwrap_err_code(CodeGen *g, IrExecutable *executab...@@ -4901,6 +4901,7 @@ static LLVMValueRef ir_render_unwrap_err_code(CodeGen *g, IrExecutable *executab
4901 if (!type_has_bits(payload_type)) {4901 if (!type_has_bits(payload_type)) {
4902 return err_union_ptr;4902 return err_union_ptr;
4903 } else {4903 } else {
4904 // TODO assign undef to the payload
4904 LLVMValueRef err_union_handle = get_handle_value(g, err_union_ptr, err_union_type, ptr_type);4905 LLVMValueRef err_union_handle = get_handle_value(g, err_union_ptr, err_union_type, ptr_type);
4905 return LLVMBuildStructGEP(g->builder, err_union_handle, err_union_err_index, "");4906 return LLVMBuildStructGEP(g->builder, err_union_handle, err_union_err_index, "");
4906 }4907 }
src/ir.cpp+50-17
...@@ -193,6 +193,8 @@ static IrInstruction *ir_analyze_unwrap_optional_payload(IrAnalyze *ira, IrInstr...@@ -193,6 +193,8 @@ static IrInstruction *ir_analyze_unwrap_optional_payload(IrAnalyze *ira, IrInstr
193 IrInstruction *base_ptr, bool safety_check_on, bool initializing);193 IrInstruction *base_ptr, bool safety_check_on, bool initializing);
194static IrInstruction *ir_analyze_unwrap_error_payload(IrAnalyze *ira, IrInstruction *source_instr,194static IrInstruction *ir_analyze_unwrap_error_payload(IrAnalyze *ira, IrInstruction *source_instr,
195 IrInstruction *base_ptr, bool safety_check_on, bool initializing);195 IrInstruction *base_ptr, bool safety_check_on, bool initializing);
196static IrInstruction *ir_analyze_unwrap_err_code(IrAnalyze *ira, IrInstruction *source_instr,
197 IrInstruction *base_ptr, bool initializing);
196198
197static ConstExprValue *const_ptr_pointee_unchecked(CodeGen *g, ConstExprValue *const_val) {199static ConstExprValue *const_ptr_pointee_unchecked(CodeGen *g, ConstExprValue *const_val) {
198 assert(get_src_ptr_type(const_val->type) != nullptr);200 assert(get_src_ptr_type(const_val->type) != nullptr);
...@@ -15016,13 +15018,17 @@ static IrInstruction *ir_resolve_result(IrAnalyze *ira, IrInstruction *suspend_s...@@ -15016,13 +15018,17 @@ static IrInstruction *ir_resolve_result(IrAnalyze *ira, IrInstruction *suspend_s
15016 if (actual_elem_type->id == ZigTypeIdOptional && value_type->id != ZigTypeIdOptional) {15018 if (actual_elem_type->id == ZigTypeIdOptional && value_type->id != ZigTypeIdOptional) {
15017 return ir_analyze_unwrap_optional_payload(ira, suspend_source_instr, result_loc, false, true);15019 return ir_analyze_unwrap_optional_payload(ira, suspend_source_instr, result_loc, false, true);
15018 } else if (actual_elem_type->id == ZigTypeIdErrorUnion && value_type->id != ZigTypeIdErrorUnion) {15020 } else if (actual_elem_type->id == ZigTypeIdErrorUnion && value_type->id != ZigTypeIdErrorUnion) {
15019 IrInstruction *unwrapped_err_ptr = ir_analyze_unwrap_error_payload(ira, suspend_source_instr,15021 if (value_type->id == ZigTypeIdErrorSet) {
15020 result_loc, false, true);15022 return ir_analyze_unwrap_err_code(ira, suspend_source_instr, result_loc, true);
15021 ZigType *actual_payload_type = actual_elem_type->data.error_union.payload_type;
15022 if (actual_payload_type->id == ZigTypeIdOptional && value_type->id != ZigTypeIdOptional) {
15023 return ir_analyze_unwrap_optional_payload(ira, suspend_source_instr, unwrapped_err_ptr, false, true);
15024 } else {15023 } else {
15025 return unwrapped_err_ptr;15024 IrInstruction *unwrapped_err_ptr = ir_analyze_unwrap_error_payload(ira, suspend_source_instr,
15025 result_loc, false, true);
15026 ZigType *actual_payload_type = actual_elem_type->data.error_union.payload_type;
15027 if (actual_payload_type->id == ZigTypeIdOptional && value_type->id != ZigTypeIdOptional) {
15028 return ir_analyze_unwrap_optional_payload(ira, suspend_source_instr, unwrapped_err_ptr, false, true);
15029 } else {
15030 return unwrapped_err_ptr;
15031 }
15026 }15032 }
15027 }15033 }
15028 return result_loc;15034 return result_loc;
...@@ -16437,6 +16443,9 @@ static IrInstruction *ir_analyze_instruction_phi(IrAnalyze *ira, IrInstructionPh...@@ -16437,6 +16443,9 @@ static IrInstruction *ir_analyze_instruction_phi(IrAnalyze *ira, IrInstructionPh
16437 peer_parent->base.source_instruction->source_node, expected_type, instructions,16443 peer_parent->base.source_instruction->source_node, expected_type, instructions,
16438 peer_parent->peer_count);16444 peer_parent->peer_count);
1643916445
16446 // the logic below assumes there are no instructions in the new current basic block yet
16447 ir_assert(ira->new_irb.current_basic_block->instruction_list.length == 0, &phi_instruction->base);
16448
16440 // In case resolving the parent activates a suspend, do it now16449 // In case resolving the parent activates a suspend, do it now
16441 IrInstruction *parent_result_loc = ir_resolve_result(ira, &phi_instruction->base, peer_parent->parent,16450 IrInstruction *parent_result_loc = ir_resolve_result(ira, &phi_instruction->base, peer_parent->parent,
16442 peer_parent->resolved_type, nullptr);16451 peer_parent->resolved_type, nullptr);
...@@ -16445,6 +16454,21 @@ static IrInstruction *ir_analyze_instruction_phi(IrAnalyze *ira, IrInstructionPh...@@ -16445,6 +16454,21 @@ static IrInstruction *ir_analyze_instruction_phi(IrAnalyze *ira, IrInstructionPh
16445 {16454 {
16446 return parent_result_loc;16455 return parent_result_loc;
16447 }16456 }
16457 // If the above code generated any instructions in the current basic block, we need
16458 // to move them to the peer parent predecessor.
16459 ZigList<IrInstruction *> instrs_to_move = {};
16460 while (ira->new_irb.current_basic_block->instruction_list.length != 0) {
16461 instrs_to_move.append(ira->new_irb.current_basic_block->instruction_list.pop());
16462 }
16463 if (instrs_to_move.length != 0) {
16464 IrBasicBlock *predecessor = peer_parent->base.source_instruction->child->owner_bb;
16465 IrInstruction *branch_instruction = predecessor->instruction_list.pop();
16466 ir_assert(branch_instruction->value.type->id == ZigTypeIdUnreachable, &phi_instruction->base);
16467 while (instrs_to_move.length != 0) {
16468 predecessor->instruction_list.append(instrs_to_move.pop());
16469 }
16470 predecessor->instruction_list.append(branch_instruction);
16471 }
16448 }16472 }
1644916473
16450 IrSuspendPosition suspend_pos;16474 IrSuspendPosition suspend_pos;
...@@ -22213,10 +22237,9 @@ static IrInstruction *ir_analyze_instruction_test_err(IrAnalyze *ira, IrInstruct...@@ -22213,10 +22237,9 @@ static IrInstruction *ir_analyze_instruction_test_err(IrAnalyze *ira, IrInstruct
22213 }22237 }
22214}22238}
2221522239
22216static IrInstruction *ir_analyze_instruction_unwrap_err_code(IrAnalyze *ira, IrInstructionUnwrapErrCode *instruction) {22240static IrInstruction *ir_analyze_unwrap_err_code(IrAnalyze *ira, IrInstruction *source_instr,
22217 IrInstruction *base_ptr = instruction->err_union_ptr->child;22241 IrInstruction *base_ptr, bool initializing)
22218 if (type_is_invalid(base_ptr->value.type))22242{
22219 return ira->codegen->invalid_instruction;
22220 ZigType *ptr_type = base_ptr->value.type;22243 ZigType *ptr_type = base_ptr->value.type;
2222122244
22222 // This will be a pointer type because unwrap err payload IR instruction operates on a pointer to a thing.22245 // This will be a pointer type because unwrap err payload IR instruction operates on a pointer to a thing.
...@@ -22238,30 +22261,38 @@ static IrInstruction *ir_analyze_instruction_unwrap_err_code(IrAnalyze *ira, IrI...@@ -22238,30 +22261,38 @@ static IrInstruction *ir_analyze_instruction_unwrap_err_code(IrAnalyze *ira, IrI
22238 if (!ptr_val)22261 if (!ptr_val)
22239 return ira->codegen->invalid_instruction;22262 return ira->codegen->invalid_instruction;
22240 if (ptr_val->data.x_ptr.mut != ConstPtrMutRuntimeVar) {22263 if (ptr_val->data.x_ptr.mut != ConstPtrMutRuntimeVar) {
22241 ConstExprValue *err_union_val = const_ptr_pointee(ira, ira->codegen, ptr_val, instruction->base.source_node);22264 ConstExprValue *err_union_val = const_ptr_pointee(ira, ira->codegen, ptr_val, source_instr->source_node);
22242 if (err_union_val == nullptr)22265 if (err_union_val == nullptr)
22243 return ira->codegen->invalid_instruction;22266 return ira->codegen->invalid_instruction;
22244 if (err_union_val->special != ConstValSpecialRuntime) {22267 if (err_union_val->special != ConstValSpecialRuntime) {
22245 ErrorTableEntry *err = err_union_val->data.x_err_union.error_set->data.x_err_set;22268 ErrorTableEntry *err = err_union_val->data.x_err_union.error_set->data.x_err_set;
22246 assert(err != nullptr);22269 assert(err != nullptr);
2224722270
22248 IrInstruction *err_set_val = ir_const(ira, &instruction->base,22271 IrInstruction *err_set_val = ir_const(ira, source_instr, type_entry->data.error_union.err_set_type);
22249 type_entry->data.error_union.err_set_type);
22250 err_set_val->value.data.x_err_set = err;22272 err_set_val->value.data.x_err_set = err;
22251 err_set_val->value.parent.id = ConstParentIdErrUnionCode;22273 err_set_val->value.parent.id = ConstParentIdErrUnionCode;
22252 err_set_val->value.parent.data.p_err_union_code.err_union_val = err_union_val;22274 err_set_val->value.parent.data.p_err_union_code.err_union_val = err_union_val;
2225322275
22254 return ir_get_ref(ira, &instruction->base, err_set_val, is_ptr_const, false);22276 return ir_get_ref(ira, source_instr, err_set_val, is_ptr_const, false);
22255 }22277 }
22256 }22278 }
22257 }22279 }
2225822280
22259 IrInstruction *result = ir_build_unwrap_err_code(&ira->new_irb,22281 IrInstruction *result = ir_build_unwrap_err_code(&ira->new_irb,
22260 instruction->base.scope, instruction->base.source_node, base_ptr);22282 source_instr->scope, source_instr->source_node, base_ptr);
22261 result->value.type = get_pointer_to_type(ira->codegen, type_entry->data.error_union.err_set_type, is_ptr_const);22283 result->value.type = get_pointer_to_type(ira->codegen, type_entry->data.error_union.err_set_type, is_ptr_const);
22262 return result;22284 return result;
22263}22285}
2226422286
22287static IrInstruction *ir_analyze_instruction_unwrap_err_code(IrAnalyze *ira,
22288 IrInstructionUnwrapErrCode *instruction)
22289{
22290 IrInstruction *base_ptr = instruction->err_union_ptr->child;
22291 if (type_is_invalid(base_ptr->value.type))
22292 return ira->codegen->invalid_instruction;
22293 return ir_analyze_unwrap_err_code(ira, &instruction->base, base_ptr, false);
22294}
22295
22265static IrInstruction *ir_analyze_unwrap_error_payload(IrAnalyze *ira, IrInstruction *source_instr,22296static IrInstruction *ir_analyze_unwrap_error_payload(IrAnalyze *ira, IrInstruction *source_instr,
22266 IrInstruction *base_ptr, bool safety_check_on, bool initializing)22297 IrInstruction *base_ptr, bool safety_check_on, bool initializing)
22267{22298{
...@@ -24783,7 +24814,6 @@ bool ir_has_side_effects(IrInstruction *instruction) {...@@ -24783,7 +24814,6 @@ bool ir_has_side_effects(IrInstruction *instruction) {
24783 case IrInstructionIdFrameAddress:24814 case IrInstructionIdFrameAddress:
24784 case IrInstructionIdHandle:24815 case IrInstructionIdHandle:
24785 case IrInstructionIdTestErr:24816 case IrInstructionIdTestErr:
24786 case IrInstructionIdUnwrapErrCode:
24787 case IrInstructionIdFnProto:24817 case IrInstructionIdFnProto:
24788 case IrInstructionIdTestComptime:24818 case IrInstructionIdTestComptime:
24789 case IrInstructionIdPtrCastSrc:24819 case IrInstructionIdPtrCastSrc:
...@@ -24846,8 +24876,11 @@ bool ir_has_side_effects(IrInstruction *instruction) {...@@ -24846,8 +24876,11 @@ bool ir_has_side_effects(IrInstruction *instruction) {
24846 {24876 {
24847 IrInstructionUnwrapErrPayload *unwrap_err_payload_instruction =24877 IrInstructionUnwrapErrPayload *unwrap_err_payload_instruction =
24848 (IrInstructionUnwrapErrPayload *)instruction;24878 (IrInstructionUnwrapErrPayload *)instruction;
24849 return unwrap_err_payload_instruction->safety_check_on;24879 return unwrap_err_payload_instruction->safety_check_on ||
24880 unwrap_err_payload_instruction->initializing;
24850 }24881 }
24882 case IrInstructionIdUnwrapErrCode:
24883 return reinterpret_cast<IrInstructionUnwrapErrCode *>(instruction)->initializing;
24851 case IrInstructionIdErrWrapPayload:24884 case IrInstructionIdErrWrapPayload:
24852 return reinterpret_cast<IrInstructionErrWrapPayload *>(instruction)->result_loc != nullptr;24885 return reinterpret_cast<IrInstructionErrWrapPayload *>(instruction)->result_loc != nullptr;
24853 case IrInstructionIdErrWrapCode:24886 case IrInstructionIdErrWrapCode:
test/stage1/behavior.zig+7-7
...@@ -21,7 +21,7 @@ comptime {...@@ -21,7 +21,7 @@ comptime {
21 _ = @import("behavior/bugs/1486.zig");21 _ = @import("behavior/bugs/1486.zig");
22 _ = @import("behavior/bugs/1500.zig");22 _ = @import("behavior/bugs/1500.zig");
23 _ = @import("behavior/bugs/1607.zig");23 _ = @import("behavior/bugs/1607.zig");
24 //_ = @import("behavior/bugs/1851.zig");24 _ = @import("behavior/bugs/1851.zig");
25 _ = @import("behavior/bugs/1914.zig");25 _ = @import("behavior/bugs/1914.zig");
26 _ = @import("behavior/bugs/2006.zig");26 _ = @import("behavior/bugs/2006.zig");
27 _ = @import("behavior/bugs/2114.zig");27 _ = @import("behavior/bugs/2114.zig");
...@@ -41,16 +41,16 @@ comptime {...@@ -41,16 +41,16 @@ comptime {
41 _ = @import("behavior/byval_arg_var.zig");41 _ = @import("behavior/byval_arg_var.zig");
42 //_ = @import("behavior/cancel.zig");42 //_ = @import("behavior/cancel.zig");
43 //_ = @import("behavior/cast.zig");43 //_ = @import("behavior/cast.zig");
44 //_ = @import("behavior/const_slice_child.zig");44 _ = @import("behavior/const_slice_child.zig");
45 //_ = @import("behavior/coroutine_await_struct.zig");45 //_ = @import("behavior/coroutine_await_struct.zig");
46 //_ = @import("behavior/coroutines.zig");46 //_ = @import("behavior/coroutines.zig");
47 //_ = @import("behavior/defer.zig");47 _ = @import("behavior/defer.zig");
48 //_ = @import("behavior/enum.zig");48 //_ = @import("behavior/enum.zig");
49 //_ = @import("behavior/enum_with_members.zig");49 //_ = @import("behavior/enum_with_members.zig");
50 //_ = @import("behavior/error.zig");50 //_ = @import("behavior/error.zig");
51 //_ = @import("behavior/eval.zig");51 //_ = @import("behavior/eval.zig");
52 _ = @import("behavior/field_parent_ptr.zig");52 _ = @import("behavior/field_parent_ptr.zig");
53 //_ = @import("behavior/fn.zig");53 _ = @import("behavior/fn.zig");
54 _ = @import("behavior/fn_in_struct_in_comptime.zig");54 _ = @import("behavior/fn_in_struct_in_comptime.zig");
55 _ = @import("behavior/for.zig");55 _ = @import("behavior/for.zig");
56 //_ = @import("behavior/generics.zig");56 //_ = @import("behavior/generics.zig");
...@@ -59,13 +59,13 @@ comptime {...@@ -59,13 +59,13 @@ comptime {
59 //_ = @import("behavior/import.zig");59 //_ = @import("behavior/import.zig");
60 _ = @import("behavior/incomplete_struct_param_tld.zig");60 _ = @import("behavior/incomplete_struct_param_tld.zig");
61 _ = @import("behavior/inttoptr.zig");61 _ = @import("behavior/inttoptr.zig");
62 //_ = @import("behavior/ir_block_deps.zig");62 _ = @import("behavior/ir_block_deps.zig");
63 //_ = @import("behavior/math.zig");63 //_ = @import("behavior/math.zig");
64 //_ = @import("behavior/merge_error_sets.zig");64 //_ = @import("behavior/merge_error_sets.zig");
65 //_ = @import("behavior/misc.zig");65 //_ = @import("behavior/misc.zig");
66 _ = @import("behavior/namespace_depends_on_compile_var.zig");66 _ = @import("behavior/namespace_depends_on_compile_var.zig");
67 _ = @import("behavior/new_stack_call.zig");67 _ = @import("behavior/new_stack_call.zig");
68 //_ = @import("behavior/null.zig");68 _ = @import("behavior/null.zig");
69 //_ = @import("behavior/optional.zig");69 //_ = @import("behavior/optional.zig");
70 //_ = @import("behavior/pointers.zig");70 //_ = @import("behavior/pointers.zig");
71 _ = @import("behavior/popcount.zig");71 _ = @import("behavior/popcount.zig");
...@@ -93,7 +93,7 @@ comptime {...@@ -93,7 +93,7 @@ comptime {
93 //_ = @import("behavior/union.zig");93 //_ = @import("behavior/union.zig");
94 _ = @import("behavior/var_args.zig");94 _ = @import("behavior/var_args.zig");
95 _ = @import("behavior/vector.zig");95 _ = @import("behavior/vector.zig");
96 //_ = @import("behavior/void.zig");96 _ = @import("behavior/void.zig");
97 //_ = @import("behavior/while.zig");97 //_ = @import("behavior/while.zig");
98 _ = @import("behavior/widening.zig");98 _ = @import("behavior/widening.zig");
99}99}