authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-21 19:22:54-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-06-10 20:47:54-07:00
log484c3e8cbcbd206023468cc16783498bbb662a2c
treeb2b5e51b708c9c9cc9d7aa4ed9c26cd649ef0035
parenta7c3ca35312094bcfaecd80cdd2b95ba89386773

llvm: fix incorrect slice lowering


1 files changed, 10 insertions(+), 6 deletions(-)

src/codegen/llvm.zig+10-6
...@@ -3359,7 +3359,11 @@ pub const DeclGen = struct {...@@ -3359,7 +3359,11 @@ pub const DeclGen = struct {
3359 else => switch (mod.intern_pool.indexToKey(tv.val.ip_index)) {3359 else => switch (mod.intern_pool.indexToKey(tv.val.ip_index)) {
3360 .int => |int| return dg.lowerIntAsPtr(int),3360 .int => |int| return dg.lowerIntAsPtr(int),
3361 .ptr => |ptr| {3361 .ptr => |ptr| {
3362 const ptr_val = switch (ptr.addr) {3362 const ptr_tv: TypedValue = switch (ptr.len) {
3363 .none => tv,
3364 else => .{ .ty = tv.ty.slicePtrFieldType(mod), .val = tv.val.slicePtr(mod) },
3365 };
3366 const llvm_ptr_val = switch (ptr.addr) {
3363 .@"var" => |@"var"| ptr: {3367 .@"var" => |@"var"| ptr: {
3364 const decl = dg.module.declPtr(@"var".owner_decl);3368 const decl = dg.module.declPtr(@"var".owner_decl);
3365 dg.module.markDeclAlive(decl);3369 dg.module.markDeclAlive(decl);
...@@ -3374,21 +3378,21 @@ pub const DeclGen = struct {...@@ -3374,21 +3378,21 @@ pub const DeclGen = struct {
3374 val;3378 val;
3375 break :ptr addrspace_casted_ptr;3379 break :ptr addrspace_casted_ptr;
3376 },3380 },
3377 .decl => |decl| try dg.lowerDeclRefValue(tv, decl),3381 .decl => |decl| try dg.lowerDeclRefValue(ptr_tv, decl),
3378 .mut_decl => |mut_decl| try dg.lowerDeclRefValue(tv, mut_decl.decl),3382 .mut_decl => |mut_decl| try dg.lowerDeclRefValue(ptr_tv, mut_decl.decl),
3379 .int => |int| dg.lowerIntAsPtr(mod.intern_pool.indexToKey(int).int),3383 .int => |int| dg.lowerIntAsPtr(mod.intern_pool.indexToKey(int).int),
3380 .eu_payload,3384 .eu_payload,
3381 .opt_payload,3385 .opt_payload,
3382 .elem,3386 .elem,
3383 .field,3387 .field,
3384 => try dg.lowerParentPtr(tv.val, tv.ty.ptrInfo(mod).bit_offset % 8 == 0),3388 => try dg.lowerParentPtr(ptr_tv.val, ptr_tv.ty.ptrInfo(mod).bit_offset % 8 == 0),
3385 .comptime_field => unreachable,3389 .comptime_field => unreachable,
3386 };3390 };
3387 switch (ptr.len) {3391 switch (ptr.len) {
3388 .none => return ptr_val,3392 .none => return llvm_ptr_val,
3389 else => {3393 else => {
3390 const fields: [2]*llvm.Value = .{3394 const fields: [2]*llvm.Value = .{
3391 ptr_val,3395 llvm_ptr_val,
3392 try dg.lowerValue(.{ .ty = Type.usize, .val = ptr.len.toValue() }),3396 try dg.lowerValue(.{ .ty = Type.usize, .val = ptr.len.toValue() }),
3393 };3397 };
3394 return dg.context.constStruct(&fields, fields.len, .False);3398 return dg.context.constStruct(&fields, fields.len, .False);