authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-07-13 20:12:23-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-07-19 23:38:40-04:00
logef84e869925d8a95e8e57895c421f398903b5f4f
tree9e9174e19931c6ba35d02eff65d73db92ac669dd
parent3f46e747a8adc61d0274c1cafa8abe8d02e6b10b

llvm: convert cursor positioning


2 files changed, 46 insertions(+), 7 deletions(-)

src/codegen/llvm.zig+44-6
...@@ -862,6 +862,7 @@ pub const Object = struct {...@@ -862,6 +862,7 @@ pub const Object = struct {
862862
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();
867868
...@@ -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);
12731274
...@@ -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;
13501351
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);
13541355
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;
13681369
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);
13721373
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 {
43484349
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);
43594361
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 }
43694373
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();
43734378
...@@ -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));
54875492
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));
54905496
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));
54935500
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();
55005508
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 {
55695578
5570 try self.genBody(body);5579 try self.genBody(body);
55715580
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));
55735583
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));
56325642
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);
56355646
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);
56385650
...@@ -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));
57115723
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);
57145727
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 }
57735787
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 }
57775792
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));
57985814
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);
58015818
...@@ -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));
73637380
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);
73667384
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 }
84888507
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));
88968915
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));
89018921
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));
89248945
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));
89268948
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 }
89538977
...@@ -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));
91879214
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));
91909218
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));
91929221
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();
92629291
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();
92669296
...@@ -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));
92799310
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));
92829314
...@@ -9343,6 +9375,7 @@ pub const FuncGen = struct {...@@ -9343,6 +9375,7 @@ pub const FuncGen = struct {
9343 defer wip.deinit();9375 defer wip.deinit();
93449376
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();
93489381
...@@ -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));
93899422
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 }
93939427
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();
93969431
...@@ -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));
95399575
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));
95469582
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));
95499586
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 }
95639600
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 }
src/codegen/llvm/Builder.zig+2-1
...@@ -1072,6 +1072,7 @@ pub const WipFunction = struct {...@@ -1072,6 +1072,7 @@ pub const WipFunction = struct {
1072 instructions: std.ArrayListUnmanaged(Instruction.Index),1072 instructions: std.ArrayListUnmanaged(Instruction.Index),
10731073
1074 const Index = enum(u32) {1074 const Index = enum(u32) {
1075 entry,
1075 _,1076 _,
10761077
1077 pub fn toLlvm(self: Index, wip: *const WipFunction) *llvm.BasicBlock {1078 pub fn toLlvm(self: Index, wip: *const WipFunction) *llvm.BasicBlock {
...@@ -1223,7 +1224,7 @@ pub const WipFunction = struct {...@@ -1223,7 +1224,7 @@ pub const WipFunction = struct {
1223 if (self.builder.useLibLlvm()) {1224 if (self.builder.useLibLlvm()) {
1224 try self.llvm.instructions.ensureUnusedCapacity(self.builder.gpa, 1);1225 try self.llvm.instructions.ensureUnusedCapacity(self.builder.gpa, 1);
12251226
1226 if (false) self.llvm.builder.positionBuilder(1227 self.llvm.builder.positionBuilder(
1227 self.cursor.block.toLlvm(self),1228 self.cursor.block.toLlvm(self),
1228 if (self.cursor.instruction < block_instructions.items.len)1229 if (self.cursor.instruction < block_instructions.items.len)
1229 self.llvm.instructions.items[1230 self.llvm.instructions.items[