| ... | @@ -862,6 +862,7 @@ pub const Object = struct { | ... | @@ -862,6 +862,7 @@ pub const Object = struct { |
| 862 | | 862 | |
| 863 | const builder = wip.llvm.builder; | 863 | const builder = wip.llvm.builder; |
| 864 | const entry_block = try wip.block("Entry"); | 864 | const entry_block = try wip.block("Entry"); |
| | 865 | wip.cursor = .{ .block = entry_block }; |
| 865 | builder.positionBuilderAtEnd(entry_block.toLlvm(&wip)); | 866 | builder.positionBuilderAtEnd(entry_block.toLlvm(&wip)); |
| 866 | builder.clearCurrentDebugLocation(); | 867 | builder.clearCurrentDebugLocation(); |
| 867 | | 868 | |
| ... | @@ -1206,7 +1207,7 @@ pub const Object = struct { | ... | @@ -1206,7 +1207,7 @@ pub const Object = struct { |
| 1206 | if (isByRef(param_ty, mod)) { | 1207 | if (isByRef(param_ty, mod)) { |
| 1207 | const alignment = param_ty.abiAlignment(mod); | 1208 | const alignment = param_ty.abiAlignment(mod); |
| 1208 | const param_llvm_ty = param.typeOf(); | 1209 | const param_llvm_ty = param.typeOf(); |
| 1209 | const arg_ptr = try o.buildAllocaInner(builder, llvm_func, false, param_llvm_ty, alignment, target); | 1210 | const arg_ptr = try o.buildAllocaInner(&wip, builder, llvm_func, false, param_llvm_ty, alignment, target); |
| 1210 | const store_inst = builder.buildStore(param, arg_ptr); | 1211 | const store_inst = builder.buildStore(param, arg_ptr); |
| 1211 | store_inst.setAlignment(alignment); | 1212 | store_inst.setAlignment(alignment); |
| 1212 | args.appendAssumeCapacity(arg_ptr); | 1213 | args.appendAssumeCapacity(arg_ptr); |
| ... | @@ -1267,7 +1268,7 @@ pub const Object = struct { | ... | @@ -1267,7 +1268,7 @@ pub const Object = struct { |
| 1267 | param_ty.abiAlignment(mod), | 1268 | param_ty.abiAlignment(mod), |
| 1268 | o.target_data.abiAlignmentOfType(int_llvm_ty), | 1269 | o.target_data.abiAlignmentOfType(int_llvm_ty), |
| 1269 | ); | 1270 | ); |
| 1270 | const arg_ptr = try o.buildAllocaInner(builder, llvm_func, false, param_llvm_ty, alignment, target); | 1271 | const arg_ptr = try o.buildAllocaInner(&wip, builder, llvm_func, false, param_llvm_ty, alignment, target); |
| 1271 | const store_inst = builder.buildStore(param, arg_ptr); | 1272 | const store_inst = builder.buildStore(param, arg_ptr); |
| 1272 | store_inst.setAlignment(alignment); | 1273 | store_inst.setAlignment(alignment); |
| 1273 | | 1274 | |
| ... | @@ -1316,7 +1317,7 @@ pub const Object = struct { | ... | @@ -1316,7 +1317,7 @@ pub const Object = struct { |
| 1316 | const param_ty = fn_info.param_types.get(ip)[it.zig_index - 1].toType(); | 1317 | const param_ty = fn_info.param_types.get(ip)[it.zig_index - 1].toType(); |
| 1317 | const param_llvm_ty = (try o.lowerType(param_ty)).toLlvm(&o.builder); | 1318 | const param_llvm_ty = (try o.lowerType(param_ty)).toLlvm(&o.builder); |
| 1318 | const param_alignment = param_ty.abiAlignment(mod); | 1319 | const param_alignment = param_ty.abiAlignment(mod); |
| 1319 | const arg_ptr = try o.buildAllocaInner(builder, llvm_func, false, param_llvm_ty, param_alignment, target); | 1320 | const arg_ptr = try o.buildAllocaInner(&wip, builder, llvm_func, false, param_llvm_ty, param_alignment, target); |
| 1320 | const llvm_ty = (try o.builder.structType(.normal, field_types)).toLlvm(&o.builder); | 1321 | const llvm_ty = (try o.builder.structType(.normal, field_types)).toLlvm(&o.builder); |
| 1321 | for (0..field_types.len) |field_i| { | 1322 | for (0..field_types.len) |field_i| { |
| 1322 | const param = llvm_func.getParam(llvm_arg_i); | 1323 | const param = llvm_func.getParam(llvm_arg_i); |
| ... | @@ -1349,7 +1350,7 @@ pub const Object = struct { | ... | @@ -1349,7 +1350,7 @@ pub const Object = struct { |
| 1349 | llvm_arg_i += 1; | 1350 | llvm_arg_i += 1; |
| 1350 | | 1351 | |
| 1351 | const alignment = param_ty.abiAlignment(mod); | 1352 | const alignment = param_ty.abiAlignment(mod); |
| 1352 | const arg_ptr = try o.buildAllocaInner(builder, llvm_func, false, param_llvm_ty, alignment, target); | 1353 | const arg_ptr = try o.buildAllocaInner(&wip, builder, llvm_func, false, param_llvm_ty, alignment, target); |
| 1353 | _ = builder.buildStore(param, arg_ptr); | 1354 | _ = builder.buildStore(param, arg_ptr); |
| 1354 | | 1355 | |
| 1355 | if (isByRef(param_ty, mod)) { | 1356 | if (isByRef(param_ty, mod)) { |
| ... | @@ -1367,7 +1368,7 @@ pub const Object = struct { | ... | @@ -1367,7 +1368,7 @@ pub const Object = struct { |
| 1367 | llvm_arg_i += 1; | 1368 | llvm_arg_i += 1; |
| 1368 | | 1369 | |
| 1369 | const alignment = param_ty.abiAlignment(mod); | 1370 | const alignment = param_ty.abiAlignment(mod); |
| 1370 | const arg_ptr = try o.buildAllocaInner(builder, llvm_func, false, param_llvm_ty, alignment, target); | 1371 | const arg_ptr = try o.buildAllocaInner(&wip, builder, llvm_func, false, param_llvm_ty, alignment, target); |
| 1371 | _ = builder.buildStore(param, arg_ptr); | 1372 | _ = builder.buildStore(param, arg_ptr); |
| 1372 | | 1373 | |
| 1373 | if (isByRef(param_ty, mod)) { | 1374 | if (isByRef(param_ty, mod)) { |
| ... | @@ -4348,6 +4349,7 @@ pub const Object = struct { | ... | @@ -4348,6 +4349,7 @@ pub const Object = struct { |
| 4348 | | 4349 | |
| 4349 | fn buildAllocaInner( | 4350 | fn buildAllocaInner( |
| 4350 | o: *Object, | 4351 | o: *Object, |
| | 4352 | wip: *Builder.WipFunction, |
| 4351 | builder: *llvm.Builder, | 4353 | builder: *llvm.Builder, |
| 4352 | llvm_func: *llvm.Value, | 4354 | llvm_func: *llvm.Value, |
| 4353 | di_scope_non_null: bool, | 4355 | di_scope_non_null: bool, |
| ... | @@ -4358,9 +4360,11 @@ pub const Object = struct { | ... | @@ -4358,9 +4360,11 @@ pub const Object = struct { |
| 4358 | const address_space = llvmAllocaAddressSpace(target); | 4360 | const address_space = llvmAllocaAddressSpace(target); |
| 4359 | | 4361 | |
| 4360 | const alloca = blk: { | 4362 | const alloca = blk: { |
| | 4363 | const prev_cursor = wip.cursor; |
| 4361 | const prev_block = builder.getInsertBlock(); | 4364 | const prev_block = builder.getInsertBlock(); |
| 4362 | const prev_debug_location = builder.getCurrentDebugLocation2(); | 4365 | const prev_debug_location = builder.getCurrentDebugLocation2(); |
| 4363 | defer { | 4366 | defer { |
| | 4367 | wip.cursor = prev_cursor; |
| 4364 | builder.positionBuilderAtEnd(prev_block); | 4368 | builder.positionBuilderAtEnd(prev_block); |
| 4365 | if (di_scope_non_null) { | 4369 | if (di_scope_non_null) { |
| 4366 | builder.setCurrentDebugLocation2(prev_debug_location); | 4370 | builder.setCurrentDebugLocation2(prev_debug_location); |
| ... | @@ -4368,6 +4372,7 @@ pub const Object = struct { | ... | @@ -4368,6 +4372,7 @@ pub const Object = struct { |
| 4368 | } | 4372 | } |
| 4369 | | 4373 | |
| 4370 | const entry_block = llvm_func.getFirstBasicBlock().?; | 4374 | const entry_block = llvm_func.getFirstBasicBlock().?; |
| | 4375 | wip.cursor = .{ .block = .entry }; |
| 4371 | builder.positionBuilder(entry_block, entry_block.getFirstInstruction()); | 4376 | builder.positionBuilder(entry_block, entry_block.getFirstInstruction()); |
| 4372 | builder.clearCurrentDebugLocation(); | 4377 | builder.clearCurrentDebugLocation(); |
| 4373 | | 4378 | |
| ... | @@ -5485,12 +5490,15 @@ pub const FuncGen = struct { | ... | @@ -5485,12 +5490,15 @@ pub const FuncGen = struct { |
| 5485 | llvm_switch.addCase(llvm_i2_00.toLlvm(&o.builder), both_null_block.toLlvm(&self.wip)); | 5490 | llvm_switch.addCase(llvm_i2_00.toLlvm(&o.builder), both_null_block.toLlvm(&self.wip)); |
| 5486 | llvm_switch.addCase(llvm_i2_11.toLlvm(&o.builder), both_pl_block.toLlvm(&self.wip)); | 5491 | llvm_switch.addCase(llvm_i2_11.toLlvm(&o.builder), both_pl_block.toLlvm(&self.wip)); |
| 5487 | | 5492 | |
| | 5493 | self.wip.cursor = .{ .block = both_null_block }; |
| 5488 | self.builder.positionBuilderAtEnd(both_null_block.toLlvm(&self.wip)); | 5494 | self.builder.positionBuilderAtEnd(both_null_block.toLlvm(&self.wip)); |
| 5489 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); | 5495 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); |
| 5490 | | 5496 | |
| | 5497 | self.wip.cursor = .{ .block = mixed_block }; |
| 5491 | self.builder.positionBuilderAtEnd(mixed_block.toLlvm(&self.wip)); | 5498 | self.builder.positionBuilderAtEnd(mixed_block.toLlvm(&self.wip)); |
| 5492 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); | 5499 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); |
| 5493 | | 5500 | |
| | 5501 | self.wip.cursor = .{ .block = both_pl_block }; |
| 5494 | self.builder.positionBuilderAtEnd(both_pl_block.toLlvm(&self.wip)); | 5502 | self.builder.positionBuilderAtEnd(both_pl_block.toLlvm(&self.wip)); |
| 5495 | const lhs_payload = try self.optPayloadHandle(opt_llvm_ty, lhs, scalar_ty, true); | 5503 | const lhs_payload = try self.optPayloadHandle(opt_llvm_ty, lhs, scalar_ty, true); |
| 5496 | const rhs_payload = try self.optPayloadHandle(opt_llvm_ty, rhs, scalar_ty, true); | 5504 | const rhs_payload = try self.optPayloadHandle(opt_llvm_ty, rhs, scalar_ty, true); |
| ... | @@ -5498,6 +5506,7 @@ pub const FuncGen = struct { | ... | @@ -5498,6 +5506,7 @@ pub const FuncGen = struct { |
| 5498 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); | 5506 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); |
| 5499 | const both_pl_block_end = self.builder.getInsertBlock(); | 5507 | const both_pl_block_end = self.builder.getInsertBlock(); |
| 5500 | | 5508 | |
| | 5509 | self.wip.cursor = .{ .block = end_block }; |
| 5501 | self.builder.positionBuilderAtEnd(end_block.toLlvm(&self.wip)); | 5510 | self.builder.positionBuilderAtEnd(end_block.toLlvm(&self.wip)); |
| 5502 | const incoming_blocks: [3]*llvm.BasicBlock = .{ | 5511 | const incoming_blocks: [3]*llvm.BasicBlock = .{ |
| 5503 | both_null_block.toLlvm(&self.wip), | 5512 | both_null_block.toLlvm(&self.wip), |
| ... | @@ -5569,6 +5578,7 @@ pub const FuncGen = struct { | ... | @@ -5569,6 +5578,7 @@ pub const FuncGen = struct { |
| 5569 | | 5578 | |
| 5570 | try self.genBody(body); | 5579 | try self.genBody(body); |
| 5571 | | 5580 | |
| | 5581 | self.wip.cursor = .{ .block = parent_bb }; |
| 5572 | self.builder.positionBuilderAtEnd(parent_bb.toLlvm(&self.wip)); | 5582 | self.builder.positionBuilderAtEnd(parent_bb.toLlvm(&self.wip)); |
| 5573 | | 5583 | |
| 5574 | // Create a phi node only if the block returns a value. | 5584 | // Create a phi node only if the block returns a value. |
| ... | @@ -5630,9 +5640,11 @@ pub const FuncGen = struct { | ... | @@ -5630,9 +5640,11 @@ pub const FuncGen = struct { |
| 5630 | const else_block = try self.wip.block("Else"); | 5640 | const else_block = try self.wip.block("Else"); |
| 5631 | _ = self.builder.buildCondBr(cond, then_block.toLlvm(&self.wip), else_block.toLlvm(&self.wip)); | 5641 | _ = self.builder.buildCondBr(cond, then_block.toLlvm(&self.wip), else_block.toLlvm(&self.wip)); |
| 5632 | | 5642 | |
| | 5643 | self.wip.cursor = .{ .block = then_block }; |
| 5633 | self.builder.positionBuilderAtEnd(then_block.toLlvm(&self.wip)); | 5644 | self.builder.positionBuilderAtEnd(then_block.toLlvm(&self.wip)); |
| 5634 | try self.genBody(then_body); | 5645 | try self.genBody(then_body); |
| 5635 | | 5646 | |
| | 5647 | self.wip.cursor = .{ .block = else_block }; |
| 5636 | self.builder.positionBuilderAtEnd(else_block.toLlvm(&self.wip)); | 5648 | self.builder.positionBuilderAtEnd(else_block.toLlvm(&self.wip)); |
| 5637 | try self.genBody(else_body); | 5649 | try self.genBody(else_body); |
| 5638 | | 5650 | |
| ... | @@ -5709,9 +5721,11 @@ pub const FuncGen = struct { | ... | @@ -5709,9 +5721,11 @@ pub const FuncGen = struct { |
| 5709 | const continue_block = try fg.wip.block("TryCont"); | 5721 | const continue_block = try fg.wip.block("TryCont"); |
| 5710 | _ = fg.builder.buildCondBr(is_err, return_block.toLlvm(&fg.wip), continue_block.toLlvm(&fg.wip)); | 5722 | _ = fg.builder.buildCondBr(is_err, return_block.toLlvm(&fg.wip), continue_block.toLlvm(&fg.wip)); |
| 5711 | | 5723 | |
| | 5724 | fg.wip.cursor = .{ .block = return_block }; |
| 5712 | fg.builder.positionBuilderAtEnd(return_block.toLlvm(&fg.wip)); | 5725 | fg.builder.positionBuilderAtEnd(return_block.toLlvm(&fg.wip)); |
| 5713 | try fg.genBody(body); | 5726 | try fg.genBody(body); |
| 5714 | | 5727 | |
| | 5728 | fg.wip.cursor = .{ .block = continue_block }; |
| 5715 | fg.builder.positionBuilderAtEnd(continue_block.toLlvm(&fg.wip)); | 5729 | fg.builder.positionBuilderAtEnd(continue_block.toLlvm(&fg.wip)); |
| 5716 | } | 5730 | } |
| 5717 | if (is_unused) { | 5731 | if (is_unused) { |
| ... | @@ -5771,10 +5785,12 @@ pub const FuncGen = struct { | ... | @@ -5771,10 +5785,12 @@ pub const FuncGen = struct { |
| 5771 | llvm_switch.addCase(llvm_int_item, case_block.toLlvm(&self.wip)); | 5785 | llvm_switch.addCase(llvm_int_item, case_block.toLlvm(&self.wip)); |
| 5772 | } | 5786 | } |
| 5773 | | 5787 | |
| | 5788 | self.wip.cursor = .{ .block = case_block }; |
| 5774 | self.builder.positionBuilderAtEnd(case_block.toLlvm(&self.wip)); | 5789 | self.builder.positionBuilderAtEnd(case_block.toLlvm(&self.wip)); |
| 5775 | try self.genBody(case_body); | 5790 | try self.genBody(case_body); |
| 5776 | } | 5791 | } |
| 5777 | | 5792 | |
| | 5793 | self.wip.cursor = .{ .block = else_block }; |
| 5778 | self.builder.positionBuilderAtEnd(else_block.toLlvm(&self.wip)); | 5794 | self.builder.positionBuilderAtEnd(else_block.toLlvm(&self.wip)); |
| 5779 | const else_body = self.air.extra[extra_index..][0..switch_br.data.else_body_len]; | 5795 | const else_body = self.air.extra[extra_index..][0..switch_br.data.else_body_len]; |
| 5780 | if (else_body.len != 0) { | 5796 | if (else_body.len != 0) { |
| ... | @@ -5796,6 +5812,7 @@ pub const FuncGen = struct { | ... | @@ -5796,6 +5812,7 @@ pub const FuncGen = struct { |
| 5796 | const loop_block = try self.wip.block("Loop"); | 5812 | const loop_block = try self.wip.block("Loop"); |
| 5797 | _ = self.builder.buildBr(loop_block.toLlvm(&self.wip)); | 5813 | _ = self.builder.buildBr(loop_block.toLlvm(&self.wip)); |
| 5798 | | 5814 | |
| | 5815 | self.wip.cursor = .{ .block = loop_block }; |
| 5799 | self.builder.positionBuilderAtEnd(loop_block.toLlvm(&self.wip)); | 5816 | self.builder.positionBuilderAtEnd(loop_block.toLlvm(&self.wip)); |
| 5800 | try self.genBody(body); | 5817 | try self.genBody(body); |
| 5801 | | 5818 | |
| ... | @@ -7361,9 +7378,11 @@ pub const FuncGen = struct { | ... | @@ -7361,9 +7378,11 @@ pub const FuncGen = struct { |
| 7361 | const ok_block = try fg.wip.block("OverflowOk"); | 7378 | const ok_block = try fg.wip.block("OverflowOk"); |
| 7362 | _ = fg.builder.buildCondBr(scalar_overflow_bit, fail_block.toLlvm(&fg.wip), ok_block.toLlvm(&fg.wip)); | 7379 | _ = fg.builder.buildCondBr(scalar_overflow_bit, fail_block.toLlvm(&fg.wip), ok_block.toLlvm(&fg.wip)); |
| 7363 | | 7380 | |
| | 7381 | fg.wip.cursor = .{ .block = fail_block }; |
| 7364 | fg.builder.positionBuilderAtEnd(fail_block.toLlvm(&fg.wip)); | 7382 | fg.builder.positionBuilderAtEnd(fail_block.toLlvm(&fg.wip)); |
| 7365 | try fg.buildSimplePanic(.integer_overflow); | 7383 | try fg.buildSimplePanic(.integer_overflow); |
| 7366 | | 7384 | |
| | 7385 | fg.wip.cursor = .{ .block = ok_block }; |
| 7367 | fg.builder.positionBuilderAtEnd(ok_block.toLlvm(&fg.wip)); | 7386 | fg.builder.positionBuilderAtEnd(ok_block.toLlvm(&fg.wip)); |
| 7368 | return fg.builder.buildExtractValue(result_struct, 0, ""); | 7387 | return fg.builder.buildExtractValue(result_struct, 0, ""); |
| 7369 | } | 7388 | } |
| ... | @@ -8483,7 +8502,7 @@ pub const FuncGen = struct { | ... | @@ -8483,7 +8502,7 @@ pub const FuncGen = struct { |
| 8483 | const o = self.dg.object; | 8502 | const o = self.dg.object; |
| 8484 | const mod = o.module; | 8503 | const mod = o.module; |
| 8485 | const target = mod.getTarget(); | 8504 | const target = mod.getTarget(); |
| 8486 | return o.buildAllocaInner(self.builder, self.llvm_func, self.di_scope != null, llvm_ty, alignment, target); | 8505 | return o.buildAllocaInner(&self.wip, self.builder, self.llvm_func, self.di_scope != null, llvm_ty, alignment, target); |
| 8487 | } | 8506 | } |
| 8488 | | 8507 | |
| 8489 | fn airStore(self: *FuncGen, inst: Air.Inst.Index, safety: bool) !?*llvm.Value { | 8508 | fn airStore(self: *FuncGen, inst: Air.Inst.Index, safety: bool) !?*llvm.Value { |
| ... | @@ -8894,11 +8913,13 @@ pub const FuncGen = struct { | ... | @@ -8894,11 +8913,13 @@ pub const FuncGen = struct { |
| 8894 | const end_ptr = self.builder.buildInBoundsGEP(elem_llvm_ty, dest_ptr, &len_gep, len_gep.len, ""); | 8913 | const end_ptr = self.builder.buildInBoundsGEP(elem_llvm_ty, dest_ptr, &len_gep, len_gep.len, ""); |
| 8895 | _ = self.builder.buildBr(loop_block.toLlvm(&self.wip)); | 8914 | _ = self.builder.buildBr(loop_block.toLlvm(&self.wip)); |
| 8896 | | 8915 | |
| | 8916 | self.wip.cursor = .{ .block = loop_block }; |
| 8897 | self.builder.positionBuilderAtEnd(loop_block.toLlvm(&self.wip)); | 8917 | self.builder.positionBuilderAtEnd(loop_block.toLlvm(&self.wip)); |
| 8898 | const it_ptr = self.builder.buildPhi(Builder.Type.ptr.toLlvm(&o.builder), ""); | 8918 | const it_ptr = self.builder.buildPhi(Builder.Type.ptr.toLlvm(&o.builder), ""); |
| 8899 | const end = self.builder.buildICmp(.NE, it_ptr, end_ptr, ""); | 8919 | const end = self.builder.buildICmp(.NE, it_ptr, end_ptr, ""); |
| 8900 | _ = self.builder.buildCondBr(end, body_block.toLlvm(&self.wip), end_block.toLlvm(&self.wip)); | 8920 | _ = self.builder.buildCondBr(end, body_block.toLlvm(&self.wip), end_block.toLlvm(&self.wip)); |
| 8901 | | 8921 | |
| | 8922 | self.wip.cursor = .{ .block = body_block }; |
| 8902 | self.builder.positionBuilderAtEnd(body_block.toLlvm(&self.wip)); | 8923 | self.builder.positionBuilderAtEnd(body_block.toLlvm(&self.wip)); |
| 8903 | const elem_abi_alignment = elem_ty.abiAlignment(mod); | 8924 | const elem_abi_alignment = elem_ty.abiAlignment(mod); |
| 8904 | const it_ptr_alignment = @min(elem_abi_alignment, dest_ptr_align); | 8925 | const it_ptr_alignment = @min(elem_abi_alignment, dest_ptr_align); |
| ... | @@ -8922,6 +8943,7 @@ pub const FuncGen = struct { | ... | @@ -8922,6 +8943,7 @@ pub const FuncGen = struct { |
| 8922 | const next_ptr = self.builder.buildInBoundsGEP(elem_llvm_ty, it_ptr, &one_gep, one_gep.len, ""); | 8943 | const next_ptr = self.builder.buildInBoundsGEP(elem_llvm_ty, it_ptr, &one_gep, one_gep.len, ""); |
| 8923 | _ = self.builder.buildBr(loop_block.toLlvm(&self.wip)); | 8944 | _ = self.builder.buildBr(loop_block.toLlvm(&self.wip)); |
| 8924 | | 8945 | |
| | 8946 | self.wip.cursor = .{ .block = end_block }; |
| 8925 | self.builder.positionBuilderAtEnd(end_block.toLlvm(&self.wip)); | 8947 | self.builder.positionBuilderAtEnd(end_block.toLlvm(&self.wip)); |
| 8926 | | 8948 | |
| 8927 | const incoming_values: [2]*llvm.Value = .{ next_ptr, dest_ptr }; | 8949 | const incoming_values: [2]*llvm.Value = .{ next_ptr, dest_ptr }; |
| ... | @@ -8945,9 +8967,11 @@ pub const FuncGen = struct { | ... | @@ -8945,9 +8967,11 @@ pub const FuncGen = struct { |
| 8945 | const memset_block = try self.wip.block("MemsetTrapSkip"); | 8967 | const memset_block = try self.wip.block("MemsetTrapSkip"); |
| 8946 | const end_block = try self.wip.block("MemsetTrapEnd"); | 8968 | const end_block = try self.wip.block("MemsetTrapEnd"); |
| 8947 | _ = self.builder.buildCondBr(cond, memset_block.toLlvm(&self.wip), end_block.toLlvm(&self.wip)); | 8969 | _ = self.builder.buildCondBr(cond, memset_block.toLlvm(&self.wip), end_block.toLlvm(&self.wip)); |
| | 8970 | self.wip.cursor = .{ .block = memset_block }; |
| 8948 | self.builder.positionBuilderAtEnd(memset_block.toLlvm(&self.wip)); | 8971 | self.builder.positionBuilderAtEnd(memset_block.toLlvm(&self.wip)); |
| 8949 | _ = self.builder.buildMemSet(dest_ptr, fill_byte, len, dest_ptr_align, is_volatile); | 8972 | _ = self.builder.buildMemSet(dest_ptr, fill_byte, len, dest_ptr_align, is_volatile); |
| 8950 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); | 8973 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); |
| | 8974 | self.wip.cursor = .{ .block = end_block }; |
| 8951 | self.builder.positionBuilderAtEnd(end_block.toLlvm(&self.wip)); | 8975 | self.builder.positionBuilderAtEnd(end_block.toLlvm(&self.wip)); |
| 8952 | } | 8976 | } |
| 8953 | | 8977 | |
| ... | @@ -8978,6 +9002,7 @@ pub const FuncGen = struct { | ... | @@ -8978,6 +9002,7 @@ pub const FuncGen = struct { |
| 8978 | const memcpy_block = try self.wip.block("MemcpyTrapSkip"); | 9002 | const memcpy_block = try self.wip.block("MemcpyTrapSkip"); |
| 8979 | const end_block = try self.wip.block("MemcpyTrapEnd"); | 9003 | const end_block = try self.wip.block("MemcpyTrapEnd"); |
| 8980 | _ = self.builder.buildCondBr(cond, memcpy_block.toLlvm(&self.wip), end_block.toLlvm(&self.wip)); | 9004 | _ = self.builder.buildCondBr(cond, memcpy_block.toLlvm(&self.wip), end_block.toLlvm(&self.wip)); |
| | 9005 | self.wip.cursor = .{ .block = memcpy_block }; |
| 8981 | self.builder.positionBuilderAtEnd(memcpy_block.toLlvm(&self.wip)); | 9006 | self.builder.positionBuilderAtEnd(memcpy_block.toLlvm(&self.wip)); |
| 8982 | _ = self.builder.buildMemCpy( | 9007 | _ = self.builder.buildMemCpy( |
| 8983 | dest_ptr, | 9008 | dest_ptr, |
| ... | @@ -8988,6 +9013,7 @@ pub const FuncGen = struct { | ... | @@ -8988,6 +9013,7 @@ pub const FuncGen = struct { |
| 8988 | is_volatile, | 9013 | is_volatile, |
| 8989 | ); | 9014 | ); |
| 8990 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); | 9015 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); |
| | 9016 | self.wip.cursor = .{ .block = end_block }; |
| 8991 | self.builder.positionBuilderAtEnd(end_block.toLlvm(&self.wip)); | 9017 | self.builder.positionBuilderAtEnd(end_block.toLlvm(&self.wip)); |
| 8992 | return null; | 9018 | return null; |
| 8993 | } | 9019 | } |
| ... | @@ -9182,12 +9208,15 @@ pub const FuncGen = struct { | ... | @@ -9182,12 +9208,15 @@ pub const FuncGen = struct { |
| 9182 | try o.lowerValue((try mod.intValue(Type.err_int, err_int)).toIntern()); | 9208 | try o.lowerValue((try mod.intValue(Type.err_int, err_int)).toIntern()); |
| 9183 | switch_instr.addCase(this_tag_int_value.toLlvm(&o.builder), valid_block.toLlvm(&self.wip)); | 9209 | switch_instr.addCase(this_tag_int_value.toLlvm(&o.builder), valid_block.toLlvm(&self.wip)); |
| 9184 | } | 9210 | } |
| | 9211 | self.wip.cursor = .{ .block = valid_block }; |
| 9185 | self.builder.positionBuilderAtEnd(valid_block.toLlvm(&self.wip)); | 9212 | self.builder.positionBuilderAtEnd(valid_block.toLlvm(&self.wip)); |
| 9186 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); | 9213 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); |
| 9187 | | 9214 | |
| | 9215 | self.wip.cursor = .{ .block = invalid_block }; |
| 9188 | self.builder.positionBuilderAtEnd(invalid_block.toLlvm(&self.wip)); | 9216 | self.builder.positionBuilderAtEnd(invalid_block.toLlvm(&self.wip)); |
| 9189 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); | 9217 | _ = self.builder.buildBr(end_block.toLlvm(&self.wip)); |
| 9190 | | 9218 | |
| | 9219 | self.wip.cursor = .{ .block = end_block }; |
| 9191 | self.builder.positionBuilderAtEnd(end_block.toLlvm(&self.wip)); | 9220 | self.builder.positionBuilderAtEnd(end_block.toLlvm(&self.wip)); |
| 9192 | | 9221 | |
| 9193 | const incoming_values: [2]*llvm.Value = .{ | 9222 | const incoming_values: [2]*llvm.Value = .{ |
| ... | @@ -9261,6 +9290,7 @@ pub const FuncGen = struct { | ... | @@ -9261,6 +9290,7 @@ pub const FuncGen = struct { |
| 9261 | defer wip.deinit(); | 9290 | defer wip.deinit(); |
| 9262 | | 9291 | |
| 9263 | const entry_block = try wip.block("Entry"); | 9292 | const entry_block = try wip.block("Entry"); |
| | 9293 | wip.cursor = .{ .block = entry_block }; |
| 9264 | self.builder.positionBuilderAtEnd(entry_block.toLlvm(&wip)); | 9294 | self.builder.positionBuilderAtEnd(entry_block.toLlvm(&wip)); |
| 9265 | self.builder.clearCurrentDebugLocation(); | 9295 | self.builder.clearCurrentDebugLocation(); |
| 9266 | | 9296 | |
| ... | @@ -9274,9 +9304,11 @@ pub const FuncGen = struct { | ... | @@ -9274,9 +9304,11 @@ pub const FuncGen = struct { |
| 9274 | try o.lowerValue((try mod.enumValueFieldIndex(enum_ty, @intCast(field_index))).toIntern()); | 9304 | try o.lowerValue((try mod.enumValueFieldIndex(enum_ty, @intCast(field_index))).toIntern()); |
| 9275 | switch_instr.addCase(this_tag_int_value.toLlvm(&o.builder), named_block.toLlvm(&wip)); | 9305 | switch_instr.addCase(this_tag_int_value.toLlvm(&o.builder), named_block.toLlvm(&wip)); |
| 9276 | } | 9306 | } |
| | 9307 | wip.cursor = .{ .block = named_block }; |
| 9277 | self.builder.positionBuilderAtEnd(named_block.toLlvm(&wip)); | 9308 | self.builder.positionBuilderAtEnd(named_block.toLlvm(&wip)); |
| 9278 | _ = self.builder.buildRet(Builder.Constant.true.toLlvm(&o.builder)); | 9309 | _ = self.builder.buildRet(Builder.Constant.true.toLlvm(&o.builder)); |
| 9279 | | 9310 | |
| | 9311 | wip.cursor = .{ .block = unnamed_block }; |
| 9280 | self.builder.positionBuilderAtEnd(unnamed_block.toLlvm(&wip)); | 9312 | self.builder.positionBuilderAtEnd(unnamed_block.toLlvm(&wip)); |
| 9281 | _ = self.builder.buildRet(Builder.Constant.false.toLlvm(&o.builder)); | 9313 | _ = self.builder.buildRet(Builder.Constant.false.toLlvm(&o.builder)); |
| 9282 | | 9314 | |
| ... | @@ -9343,6 +9375,7 @@ pub const FuncGen = struct { | ... | @@ -9343,6 +9375,7 @@ pub const FuncGen = struct { |
| 9343 | defer wip.deinit(); | 9375 | defer wip.deinit(); |
| 9344 | | 9376 | |
| 9345 | const entry_block = try wip.block("Entry"); | 9377 | const entry_block = try wip.block("Entry"); |
| | 9378 | wip.cursor = .{ .block = entry_block }; |
| 9346 | self.builder.positionBuilderAtEnd(entry_block.toLlvm(&wip)); | 9379 | self.builder.positionBuilderAtEnd(entry_block.toLlvm(&wip)); |
| 9347 | self.builder.clearCurrentDebugLocation(); | 9380 | self.builder.clearCurrentDebugLocation(); |
| 9348 | | 9381 | |
| ... | @@ -9387,10 +9420,12 @@ pub const FuncGen = struct { | ... | @@ -9387,10 +9420,12 @@ pub const FuncGen = struct { |
| 9387 | try o.lowerValue((try mod.enumValueFieldIndex(enum_ty, @intCast(field_index))).toIntern()); | 9420 | try o.lowerValue((try mod.enumValueFieldIndex(enum_ty, @intCast(field_index))).toIntern()); |
| 9388 | switch_instr.addCase(this_tag_int_value.toLlvm(&o.builder), return_block.toLlvm(&wip)); | 9421 | switch_instr.addCase(this_tag_int_value.toLlvm(&o.builder), return_block.toLlvm(&wip)); |
| 9389 | | 9422 | |
| | 9423 | wip.cursor = .{ .block = return_block }; |
| 9390 | self.builder.positionBuilderAtEnd(return_block.toLlvm(&wip)); | 9424 | self.builder.positionBuilderAtEnd(return_block.toLlvm(&wip)); |
| 9391 | _ = self.builder.buildRet(slice_val.toLlvm(&o.builder)); | 9425 | _ = self.builder.buildRet(slice_val.toLlvm(&o.builder)); |
| 9392 | } | 9426 | } |
| 9393 | | 9427 | |
| | 9428 | wip.cursor = .{ .block = bad_value_block }; |
| 9394 | self.builder.positionBuilderAtEnd(bad_value_block.toLlvm(&wip)); | 9429 | self.builder.positionBuilderAtEnd(bad_value_block.toLlvm(&wip)); |
| 9395 | _ = self.builder.buildUnreachable(); | 9430 | _ = self.builder.buildUnreachable(); |
| 9396 | | 9431 | |
| ... | @@ -9535,6 +9570,7 @@ pub const FuncGen = struct { | ... | @@ -9535,6 +9570,7 @@ pub const FuncGen = struct { |
| 9535 | const loop_exit = try self.wip.block("AfterReduce"); | 9570 | const loop_exit = try self.wip.block("AfterReduce"); |
| 9536 | _ = self.builder.buildBr(loop.toLlvm(&self.wip)); | 9571 | _ = self.builder.buildBr(loop.toLlvm(&self.wip)); |
| 9537 | { | 9572 | { |
| | 9573 | self.wip.cursor = .{ .block = loop }; |
| 9538 | self.builder.positionBuilderAtEnd(loop.toLlvm(&self.wip)); | 9574 | self.builder.positionBuilderAtEnd(loop.toLlvm(&self.wip)); |
| 9539 | | 9575 | |
| 9540 | // while (i < vec.len) | 9576 | // while (i < vec.len) |
| ... | @@ -9545,6 +9581,7 @@ pub const FuncGen = struct { | ... | @@ -9545,6 +9581,7 @@ pub const FuncGen = struct { |
| 9545 | _ = self.builder.buildCondBr(cond, loop_then.toLlvm(&self.wip), loop_exit.toLlvm(&self.wip)); | 9581 | _ = self.builder.buildCondBr(cond, loop_then.toLlvm(&self.wip), loop_exit.toLlvm(&self.wip)); |
| 9546 | | 9582 | |
| 9547 | { | 9583 | { |
| | 9584 | self.wip.cursor = .{ .block = loop_then }; |
| 9548 | self.builder.positionBuilderAtEnd(loop_then.toLlvm(&self.wip)); | 9585 | self.builder.positionBuilderAtEnd(loop_then.toLlvm(&self.wip)); |
| 9549 | | 9586 | |
| 9550 | // accum = f(accum, vec[i]); | 9587 | // accum = f(accum, vec[i]); |
| ... | @@ -9561,6 +9598,7 @@ pub const FuncGen = struct { | ... | @@ -9561,6 +9598,7 @@ pub const FuncGen = struct { |
| 9561 | } | 9598 | } |
| 9562 | } | 9599 | } |
| 9563 | | 9600 | |
| | 9601 | self.wip.cursor = .{ .block = loop_exit }; |
| 9564 | self.builder.positionBuilderAtEnd(loop_exit.toLlvm(&self.wip)); | 9602 | self.builder.positionBuilderAtEnd(loop_exit.toLlvm(&self.wip)); |
| 9565 | return self.builder.buildLoad(llvm_result_ty, accum_ptr, ""); | 9603 | return self.builder.buildLoad(llvm_result_ty, accum_ptr, ""); |
| 9566 | } | 9604 | } |