authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-11 01:24:55-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-11 01:24:55-04:00
loga431a73dabd205667c1226e4d265fca0d25e6356
tree9a79cf110fe7835f4984f5c5c2234f1924733b7d
parentb053a655734a35405f97818d1586d524f6b003b5
signaturelock-open Commit is signed but in an unrecognized format.

fixes for crashes and compile errors


1 files changed, 54 insertions(+), 32 deletions(-)

src/ir.cpp+54-32
......@@ -3246,6 +3246,7 @@ static IrInstruction *ir_build_end_expr(IrBuilder *irb, Scope *scope, AstNode *s
32463246 IrInstruction *value, ResultLoc *result_loc)
32473247{
32483248 IrInstructionEndExpr *instruction = ir_build_instruction<IrInstructionEndExpr>(irb, scope, source_node);
3249 instruction->base.is_gen = true;
32493250 instruction->value = value;
32503251 instruction->result_loc = result_loc;
32513252
......@@ -5487,8 +5488,10 @@ static IrInstruction *ir_lval_wrap(IrBuilder *irb, Scope *scope, IrInstruction *
54875488 // We needed a pointer to a value, but we got a value. So we create
54885489 // an instruction which just makes a pointer of it.
54895490 return ir_build_ref(irb, scope, value->source_node, value, false, false);
5490 } else {
5491 } else if (result_loc != nullptr) {
54915492 return ir_expr_wrap(irb, scope, value, result_loc);
5493 } else {
5494 return value;
54925495 }
54935496
54945497}
......@@ -5625,6 +5628,10 @@ static IrInstruction *ir_gen_container_init_expr(IrBuilder *irb, Scope *scope, A
56255628{
56265629 assert(node->type == NodeTypeContainerInitExpr);
56275630
5631 if (ir_should_inline(irb->exec, scope)) {
5632 result_loc = nullptr;
5633 }
5634
56285635 AstNodeContainerInitExpr *container_init_expr = &node->data.container_init_expr;
56295636 ContainerInitKind kind = container_init_expr->kind;
56305637
......@@ -5648,12 +5655,15 @@ static IrInstruction *ir_gen_container_init_expr(IrBuilder *irb, Scope *scope, A
56485655 return irb->codegen->invalid_instruction;
56495656 }
56505657
5651 src_assert(result_loc->scope_elide == nullptr, node);
5652 result_loc->scope_elide = create_elide_scope(irb->codegen, node, scope);
5658 IrInstruction *container_ptr = nullptr;
5659 if (result_loc != nullptr) {
5660 src_assert(result_loc->scope_elide == nullptr, node);
5661 result_loc->scope_elide = create_elide_scope(irb->codegen, node, scope);
56535662
5654 src_assert(result_loc != nullptr, node);
5655 IrInstruction *container_ptr = ir_build_resolve_result(irb, &result_loc->scope_elide->base,
5656 node, result_loc, container_type);
5663 src_assert(result_loc != nullptr, node);
5664 container_ptr = ir_build_resolve_result(irb, &result_loc->scope_elide->base,
5665 node, result_loc, container_type);
5666 }
56575667
56585668 size_t field_count = container_init_expr->entries.length;
56595669 IrInstructionContainerInitFieldsField *fields = allocate<IrInstructionContainerInitFieldsField>(field_count);
......@@ -5664,16 +5674,21 @@ static IrInstruction *ir_gen_container_init_expr(IrBuilder *irb, Scope *scope, A
56645674 Buf *name = entry_node->data.struct_val_field.name;
56655675 AstNode *expr_node = entry_node->data.struct_val_field.expr;
56665676
5667 IrInstruction *field_ptr = ir_build_field_ptr(irb, &result_loc->scope_elide->base, expr_node,
5668 container_ptr, name, true);
5669 ResultLocInstruction *result_loc_inst = allocate<ResultLocInstruction>(1);
5670 result_loc_inst->base.id = ResultLocIdInstruction;
5671 result_loc_inst->base.source_instruction = field_ptr;
5672 ir_ref_instruction(field_ptr, irb->current_basic_block);
5673 ResultLoc *child_result_loc = &result_loc_inst->base;
5677 Scope *val_scope = scope;
5678 ResultLoc *child_result_loc = nullptr;
5679 if (container_ptr != nullptr) {
5680 IrInstruction *field_ptr = ir_build_field_ptr(irb, &result_loc->scope_elide->base, expr_node,
5681 container_ptr, name, true);
5682 ResultLocInstruction *result_loc_inst = allocate<ResultLocInstruction>(1);
5683 result_loc_inst->base.id = ResultLocIdInstruction;
5684 result_loc_inst->base.source_instruction = field_ptr;
5685 ir_ref_instruction(field_ptr, irb->current_basic_block);
5686 child_result_loc = &result_loc_inst->base;
5687 val_scope = &result_loc->scope_elide->base;
5688 }
56745689
5675 IrInstruction *expr_value = ir_gen_node_extra(irb, expr_node, &result_loc->scope_elide->base,
5676 LValNone, child_result_loc);
5690 IrInstruction *expr_value = ir_gen_node_extra(irb, expr_node, val_scope, LValNone,
5691 child_result_loc);
56775692 if (expr_value == irb->codegen->invalid_instruction)
56785693 return expr_value;
56795694
......@@ -5686,9 +5701,6 @@ static IrInstruction *ir_gen_container_init_expr(IrBuilder *irb, Scope *scope, A
56865701 return ir_lval_wrap(irb, scope, init_fields, lval, result_loc);
56875702 }
56885703 case ContainerInitKindArray: {
5689 src_assert(result_loc->scope_elide == nullptr, node);
5690 result_loc->scope_elide = create_elide_scope(irb->codegen, node, scope);
5691
56925704 size_t item_count = container_init_expr->entries.length;
56935705
56945706 if (container_type == nullptr) {
......@@ -5696,25 +5708,35 @@ static IrInstruction *ir_gen_container_init_expr(IrBuilder *irb, Scope *scope, A
56965708 container_type = ir_build_array_type(irb, scope, node, item_count_inst, elem_type);
56975709 }
56985710
5699 src_assert(result_loc != nullptr, node);
5700 IrInstruction *container_ptr = ir_build_resolve_result(irb, &result_loc->scope_elide->base,
5701 node, result_loc, container_type);
5711 IrInstruction *container_ptr = nullptr;
5712 if (result_loc != nullptr) {
5713 src_assert(result_loc->scope_elide == nullptr, node);
5714 result_loc->scope_elide = create_elide_scope(irb->codegen, node, scope);
5715
5716 container_ptr = ir_build_resolve_result(irb, &result_loc->scope_elide->base,
5717 node, result_loc, container_type);
5718 }
57025719
57035720 IrInstruction **values = allocate<IrInstruction *>(item_count);
57045721 for (size_t i = 0; i < item_count; i += 1) {
57055722 AstNode *expr_node = container_init_expr->entries.at(i);
57065723
5707 IrInstruction *elem_index = ir_build_const_usize(irb, &result_loc->scope_elide->base, expr_node, i);
5708 IrInstruction *elem_ptr = ir_build_elem_ptr(irb, &result_loc->scope_elide->base, expr_node,
5709 container_ptr, elem_index, false, PtrLenSingle);
5710 ResultLocInstruction *result_loc_inst = allocate<ResultLocInstruction>(1);
5711 result_loc_inst->base.id = ResultLocIdInstruction;
5712 result_loc_inst->base.source_instruction = elem_ptr;
5713 ir_ref_instruction(elem_ptr, irb->current_basic_block);
5714 ResultLoc *child_result_loc = &result_loc_inst->base;
5715
5716 IrInstruction *expr_value = ir_gen_node_extra(irb, expr_node, &result_loc->scope_elide->base,
5717 LValNone, child_result_loc);
5724 ResultLoc *child_result_loc = nullptr;
5725 Scope *val_scope = scope;
5726 if (container_ptr != nullptr) {
5727 IrInstruction *elem_index = ir_build_const_usize(irb, &result_loc->scope_elide->base, expr_node, i);
5728 IrInstruction *elem_ptr = ir_build_elem_ptr(irb, &result_loc->scope_elide->base, expr_node,
5729 container_ptr, elem_index, false, PtrLenSingle);
5730 ResultLocInstruction *result_loc_inst = allocate<ResultLocInstruction>(1);
5731 result_loc_inst->base.id = ResultLocIdInstruction;
5732 result_loc_inst->base.source_instruction = elem_ptr;
5733 ir_ref_instruction(elem_ptr, irb->current_basic_block);
5734 child_result_loc = &result_loc_inst->base;
5735 val_scope = &result_loc->scope_elide->base;
5736 }
5737
5738 IrInstruction *expr_value = ir_gen_node_extra(irb, expr_node, val_scope, LValNone,
5739 child_result_loc);
57185740 if (expr_value == irb->codegen->invalid_instruction)
57195741 return expr_value;
57205742