authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-05-05 19:13:43-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-06-10 20:42:29-07:00
log31aee50c1a96b7e72b42ee885636b27fbcac8eb4
treeddd17a80a48fa620a6d4cea9d8f6a970eb90845d
parent08e97639513f09e2797bd7afcdfdfecdad6c6fd8

InternPool: add a slice encoding

This uses the data field to reference its pointer field type, which allows for efficient and infallible access of a slice type's pointer type.

15 files changed, 120 insertions(+), 65 deletions(-)

src/InternPool.zig+38
......@@ -668,6 +668,9 @@ pub const Tag = enum(u8) {
668668 /// A fully explicitly specified pointer type.
669669 /// data is payload to Pointer.
670670 type_pointer,
671 /// A slice type.
672 /// data is Index of underlying pointer type.
673 type_slice,
671674 /// An optional type.
672675 /// data is the child type.
673676 type_optional,
......@@ -984,6 +987,13 @@ pub fn indexToKey(ip: InternPool, index: Index) Key {
984987 } };
985988 },
986989
990 .type_slice => {
991 const ptr_ty_index = @intToEnum(Index, data);
992 var result = indexToKey(ip, ptr_ty_index);
993 result.ptr_type.size = .Slice;
994 return result;
995 },
996
987997 .type_optional => .{ .opt_type = @intToEnum(Index, data) },
988998
989999 .type_error_union => @panic("TODO"),
......@@ -1041,6 +1051,19 @@ pub fn get(ip: *InternPool, gpa: Allocator, key: Key) Allocator.Error!Index {
10411051 },
10421052 .ptr_type => |ptr_type| {
10431053 assert(ptr_type.elem_type != .none);
1054
1055 if (ptr_type.size == .Slice) {
1056 var new_key = key;
1057 new_key.ptr_type.size = .Many;
1058 const ptr_ty_index = try get(ip, gpa, new_key);
1059 try ip.items.ensureUnusedCapacity(gpa, 1);
1060 ip.items.appendAssumeCapacity(.{
1061 .tag = .type_slice,
1062 .data = @enumToInt(ptr_ty_index),
1063 });
1064 return @intToEnum(Index, ip.items.len - 1);
1065 }
1066
10441067 // TODO introduce more pointer encodings
10451068 ip.items.appendAssumeCapacity(.{
10461069 .tag = .type_pointer,
......@@ -1401,6 +1424,20 @@ pub fn childType(ip: InternPool, i: Index) Index {
14011424 };
14021425}
14031426
1427/// Given a slice type, returns the type of the pointer field.
1428pub fn slicePtrType(ip: InternPool, i: Index) Index {
1429 switch (i) {
1430 .const_slice_u8_type => return .manyptr_const_u8_type,
1431 .const_slice_u8_sentinel_0_type => return .manyptr_const_u8_sentinel_0_type,
1432 else => {},
1433 }
1434 const item = ip.items.get(@enumToInt(i));
1435 switch (item.tag) {
1436 .type_slice => return @intToEnum(Index, item.data),
1437 else => unreachable, // not a slice type
1438 }
1439}
1440
14041441pub fn dump(ip: InternPool) void {
14051442 dumpFallible(ip, std.heap.page_allocator) catch return;
14061443}
......@@ -1438,6 +1475,7 @@ fn dumpFallible(ip: InternPool, arena: Allocator) anyerror!void {
14381475 .type_array => @sizeOf(Vector),
14391476 .type_vector => @sizeOf(Vector),
14401477 .type_pointer => @sizeOf(Pointer),
1478 .type_slice => 0,
14411479 .type_optional => 0,
14421480 .type_error_union => @sizeOf(ErrorUnion),
14431481 .type_enum_simple => @sizeOf(EnumSimple),
src/Module.zig+1-1
......@@ -6553,7 +6553,7 @@ pub fn populateTestFunctions(
65536553 }
65546554 const decl = mod.declPtr(decl_index);
65556555 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
6556 const tmp_test_fn_ty = decl.ty.slicePtrFieldType(&buf).childType(mod);
6556 const tmp_test_fn_ty = decl.ty.slicePtrFieldType(&buf, mod).childType(mod);
65576557
65586558 const array_decl_index = d: {
65596559 // Add mod.test_functions to an array decl then make the test_functions
src/Sema.zig+6-5
......@@ -24201,7 +24201,7 @@ fn fieldPtr(
2420124201
2420224202 if (mem.eql(u8, field_name, "ptr")) {
2420324203 const buf = try sema.arena.create(Type.SlicePtrFieldTypeBuffer);
24204 const slice_ptr_ty = inner_ty.slicePtrFieldType(buf);
24204 const slice_ptr_ty = inner_ty.slicePtrFieldType(buf, mod);
2420524205
2420624206 const result_ty = try Type.ptr(sema.arena, sema.mod, .{
2420724207 .pointee_type = slice_ptr_ty,
......@@ -27804,7 +27804,7 @@ fn beginComptimePtrMutation(
2780427804 sema,
2780527805 block,
2780627806 src,
27807 parent.ty.slicePtrFieldType(try sema.arena.create(Type.SlicePtrFieldTypeBuffer)),
27807 parent.ty.slicePtrFieldType(try sema.arena.create(Type.SlicePtrFieldTypeBuffer), mod),
2780827808 &val_ptr.castTag(.slice).?.data.ptr,
2780927809 ptr_elem_ty,
2781027810 parent.decl_ref_mut,
......@@ -27859,7 +27859,7 @@ fn beginComptimePtrMutation(
2785927859 sema,
2786027860 block,
2786127861 src,
27862 parent.ty.slicePtrFieldType(try sema.arena.create(Type.SlicePtrFieldTypeBuffer)),
27862 parent.ty.slicePtrFieldType(try sema.arena.create(Type.SlicePtrFieldTypeBuffer), mod),
2786327863 &val_ptr.castTag(.slice).?.data.ptr,
2786427864 ptr_elem_ty,
2786527865 parent.decl_ref_mut,
......@@ -28256,7 +28256,7 @@ fn beginComptimePtrLoad(
2825628256 const slice_val = tv.val.castTag(.slice).?.data;
2825728257 deref.pointee = switch (field_index) {
2825828258 Value.Payload.Slice.ptr_index => TypedValue{
28259 .ty = field_ptr.container_ty.slicePtrFieldType(try sema.arena.create(Type.SlicePtrFieldTypeBuffer)),
28259 .ty = field_ptr.container_ty.slicePtrFieldType(try sema.arena.create(Type.SlicePtrFieldTypeBuffer), mod),
2826028260 .val = slice_val.ptr,
2826128261 },
2826228262 Value.Payload.Slice.len_index => TypedValue{
......@@ -29339,8 +29339,9 @@ fn analyzeSlicePtr(
2933929339 slice: Air.Inst.Ref,
2934029340 slice_ty: Type,
2934129341) CompileError!Air.Inst.Ref {
29342 const mod = sema.mod;
2934229343 const buf = try sema.arena.create(Type.SlicePtrFieldTypeBuffer);
29343 const result_ty = slice_ty.slicePtrFieldType(buf);
29344 const result_ty = slice_ty.slicePtrFieldType(buf, mod);
2934429345 if (try sema.resolveMaybeUndefVal(slice)) |val| {
2934529346 if (val.isUndef()) return sema.addConstUndef(result_ty);
2934629347 return sema.addConstant(result_ty, val.slicePtr());
src/arch/aarch64/CodeGen.zig+1-1
......@@ -3435,7 +3435,7 @@ fn airSliceElemVal(self: *Self, inst: Air.Inst.Index) !void {
34353435 const slice_ty = self.typeOf(bin_op.lhs);
34363436 const result: MCValue = if (!slice_ty.isVolatilePtr(mod) and self.liveness.isUnused(inst)) .dead else result: {
34373437 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
3438 const ptr_ty = slice_ty.slicePtrFieldType(&buf);
3438 const ptr_ty = slice_ty.slicePtrFieldType(&buf, mod);
34393439
34403440 const slice_mcv = try self.resolveInst(bin_op.lhs);
34413441 const base_mcv = slicePtr(slice_mcv);
src/arch/arm/CodeGen.zig+1-1
......@@ -2433,7 +2433,7 @@ fn airSliceElemVal(self: *Self, inst: Air.Inst.Index) !void {
24332433 const slice_ty = self.typeOf(bin_op.lhs);
24342434 const result: MCValue = if (!slice_ty.isVolatilePtr(mod) and self.liveness.isUnused(inst)) .dead else result: {
24352435 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
2436 const ptr_ty = slice_ty.slicePtrFieldType(&buf);
2436 const ptr_ty = slice_ty.slicePtrFieldType(&buf, mod);
24372437
24382438 const slice_mcv = try self.resolveInst(bin_op.lhs);
24392439 const base_mcv = slicePtr(slice_mcv);
src/arch/sparc64/CodeGen.zig+1-1
......@@ -2462,7 +2462,7 @@ fn airSliceElemVal(self: *Self, inst: Air.Inst.Index) !void {
24622462 const elem_size = elem_ty.abiSize(mod);
24632463
24642464 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
2465 const slice_ptr_field_type = slice_ty.slicePtrFieldType(&buf);
2465 const slice_ptr_field_type = slice_ty.slicePtrFieldType(&buf, mod);
24662466
24672467 const index_lock: ?RegisterLock = if (index_mcv == .register)
24682468 self.register_manager.lockRegAssumeUnused(index_mcv.register)
src/arch/x86_64/CodeGen.zig+6-5
......@@ -4056,7 +4056,7 @@ fn genSliceElemPtr(self: *Self, lhs: Air.Inst.Ref, rhs: Air.Inst.Ref) !MCValue {
40564056 const elem_ty = slice_ty.childType(mod);
40574057 const elem_size = elem_ty.abiSize(mod);
40584058 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
4059 const slice_ptr_field_type = slice_ty.slicePtrFieldType(&buf);
4059 const slice_ptr_field_type = slice_ty.slicePtrFieldType(&buf, mod);
40604060
40614061 const index_ty = self.typeOf(rhs);
40624062 const index_mcv = try self.resolveInst(rhs);
......@@ -4081,11 +4081,12 @@ fn genSliceElemPtr(self: *Self, lhs: Air.Inst.Ref, rhs: Air.Inst.Ref) !MCValue {
40814081}
40824082
40834083fn airSliceElemVal(self: *Self, inst: Air.Inst.Index) !void {
4084 const mod = self.bin_file.options.module.?;
40844085 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
40854086 const slice_ty = self.typeOf(bin_op.lhs);
40864087
40874088 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
4088 const slice_ptr_field_type = slice_ty.slicePtrFieldType(&buf);
4089 const slice_ptr_field_type = slice_ty.slicePtrFieldType(&buf, mod);
40894090 const elem_ptr = try self.genSliceElemPtr(bin_op.lhs, bin_op.rhs);
40904091 const dst_mcv = try self.allocRegOrMem(inst, false);
40914092 try self.load(dst_mcv, slice_ptr_field_type, elem_ptr);
......@@ -8682,7 +8683,7 @@ fn isNull(self: *Self, inst: Air.Inst.Index, opt_ty: Type, opt_mcv: MCValue) !MC
86828683
86838684 var ptr_buf: Type.SlicePtrFieldTypeBuffer = undefined;
86848685 const some_info: struct { off: i32, ty: Type } = if (opt_ty.optionalReprIsPayload(mod))
8685 .{ .off = 0, .ty = if (pl_ty.isSlice(mod)) pl_ty.slicePtrFieldType(&ptr_buf) else pl_ty }
8686 .{ .off = 0, .ty = if (pl_ty.isSlice(mod)) pl_ty.slicePtrFieldType(&ptr_buf, mod) else pl_ty }
86868687 else
86878688 .{ .off = @intCast(i32, pl_ty.abiSize(mod)), .ty = Type.bool };
86888689
......@@ -8774,7 +8775,7 @@ fn isNullPtr(self: *Self, inst: Air.Inst.Index, ptr_ty: Type, ptr_mcv: MCValue)
87748775
87758776 var ptr_buf: Type.SlicePtrFieldTypeBuffer = undefined;
87768777 const some_info: struct { off: i32, ty: Type } = if (opt_ty.optionalReprIsPayload(mod))
8777 .{ .off = 0, .ty = if (pl_ty.isSlice(mod)) pl_ty.slicePtrFieldType(&ptr_buf) else pl_ty }
8778 .{ .off = 0, .ty = if (pl_ty.isSlice(mod)) pl_ty.slicePtrFieldType(&ptr_buf, mod) else pl_ty }
87788779 else
87798780 .{ .off = @intCast(i32, pl_ty.abiSize(mod)), .ty = Type.bool };
87808781
......@@ -10813,7 +10814,7 @@ fn airMemset(self: *Self, inst: Air.Inst.Index, safety: bool) !void {
1081310814 switch (dst_ptr_ty.ptrSize(mod)) {
1081410815 .Slice => {
1081510816 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
10816 const slice_ptr_ty = dst_ptr_ty.slicePtrFieldType(&buf);
10817 const slice_ptr_ty = dst_ptr_ty.slicePtrFieldType(&buf, mod);
1081710818
1081810819 // TODO: this only handles slices stored in the stack
1081910820 const ptr = dst_ptr;
src/codegen.zig+3-3
......@@ -361,7 +361,7 @@ pub fn generateSymbol(
361361
362362 // generate ptr
363363 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
364 const slice_ptr_field_type = typed_value.ty.slicePtrFieldType(&buf);
364 const slice_ptr_field_type = typed_value.ty.slicePtrFieldType(&buf, mod);
365365 switch (try generateSymbol(bin_file, src_loc, .{
366366 .ty = slice_ptr_field_type,
367367 .val = slice.ptr,
......@@ -851,7 +851,7 @@ fn lowerParentPtr(
851851 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
852852 break :offset switch (field_ptr.field_index) {
853853 0 => 0,
854 1 => field_ptr.container_ty.slicePtrFieldType(&buf).abiSize(mod),
854 1 => field_ptr.container_ty.slicePtrFieldType(&buf, mod).abiSize(mod),
855855 else => unreachable,
856856 };
857857 },
......@@ -951,7 +951,7 @@ fn lowerDeclRef(
951951 if (typed_value.ty.isSlice(mod)) {
952952 // generate ptr
953953 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
954 const slice_ptr_field_type = typed_value.ty.slicePtrFieldType(&buf);
954 const slice_ptr_field_type = typed_value.ty.slicePtrFieldType(&buf, mod);
955955 switch (try generateSymbol(bin_file, src_loc, .{
956956 .ty = slice_ptr_field_type,
957957 .val = typed_value.val,
src/codegen/c.zig+7-6
......@@ -566,7 +566,7 @@ pub const DeclGen = struct {
566566 }
567567
568568 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
569 try dg.renderValue(writer, ty.slicePtrFieldType(&buf), val.slicePtr(), .Initializer);
569 try dg.renderValue(writer, ty.slicePtrFieldType(&buf, mod), val.slicePtr(), .Initializer);
570570
571571 var len_pl: Value.Payload.U64 = .{
572572 .base = .{ .tag = .int_u64 },
......@@ -787,7 +787,7 @@ pub const DeclGen = struct {
787787
788788 try writer.writeAll("{(");
789789 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
790 const ptr_ty = ty.slicePtrFieldType(&buf);
790 const ptr_ty = ty.slicePtrFieldType(&buf, mod);
791791 try dg.renderType(writer, ptr_ty);
792792 return writer.print("){x}, {0x}}}", .{try dg.fmtIntLiteral(Type.usize, val, .Other)});
793793 } else {
......@@ -1088,7 +1088,7 @@ pub const DeclGen = struct {
10881088 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
10891089
10901090 try writer.writeByte('{');
1091 try dg.renderValue(writer, ty.slicePtrFieldType(&buf), slice.ptr, initializer_type);
1091 try dg.renderValue(writer, ty.slicePtrFieldType(&buf, mod), slice.ptr, initializer_type);
10921092 try writer.writeAll(", ");
10931093 try dg.renderValue(writer, Type.usize, slice.len, initializer_type);
10941094 try writer.writeByte('}');
......@@ -4107,6 +4107,7 @@ fn airMinMax(f: *Function, inst: Air.Inst.Index, operator: u8, operation: []cons
41074107}
41084108
41094109fn airSlice(f: *Function, inst: Air.Inst.Index) !CValue {
4110 const mod = f.object.dg.module;
41104111 const ty_pl = f.air.instructions.items(.data)[inst].ty_pl;
41114112 const bin_op = f.air.extraData(Air.Bin, ty_pl.payload).data;
41124113
......@@ -4116,7 +4117,7 @@ fn airSlice(f: *Function, inst: Air.Inst.Index) !CValue {
41164117
41174118 const inst_ty = f.typeOfIndex(inst);
41184119 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
4119 const ptr_ty = inst_ty.slicePtrFieldType(&buf);
4120 const ptr_ty = inst_ty.slicePtrFieldType(&buf, mod);
41204121
41214122 const writer = f.object.writer();
41224123 const local = try f.allocLocal(inst, inst_ty);
......@@ -5112,7 +5113,7 @@ fn airIsNull(
51125113 TypedValue{ .ty = payload_ty, .val = Value.zero }
51135114 else if (payload_ty.isSlice(mod) and optional_ty.optionalReprIsPayload(mod)) rhs: {
51145115 try writer.writeAll(".ptr");
5115 const slice_ptr_ty = payload_ty.slicePtrFieldType(&slice_ptr_buf);
5116 const slice_ptr_ty = payload_ty.slicePtrFieldType(&slice_ptr_buf, mod);
51165117 break :rhs TypedValue{ .ty = slice_ptr_ty, .val = Value.null };
51175118 } else rhs: {
51185119 try writer.writeAll(".is_null");
......@@ -5845,7 +5846,7 @@ fn airArrayToSlice(f: *Function, inst: Air.Inst.Index) !CValue {
58455846 // &(*(void *)p)[0], although LLVM does via GetElementPtr
58465847 if (operand == .undef) {
58475848 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
5848 try f.writeCValue(writer, .{ .undef = inst_ty.slicePtrFieldType(&buf) }, .Initializer);
5849 try f.writeCValue(writer, .{ .undef = inst_ty.slicePtrFieldType(&buf, mod) }, .Initializer);
58495850 } else if (array_ty.hasRuntimeBitsIgnoreComptime(mod)) {
58505851 try writer.writeAll("&(");
58515852 try f.writeCValueDeref(writer, operand);
src/codegen/c/type.zig+1-1
......@@ -1432,7 +1432,7 @@ pub const CType = extern union {
14321432 .payload => unreachable,
14331433 }) |fwd_idx| {
14341434 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
1435 const ptr_ty = ty.slicePtrFieldType(&buf);
1435 const ptr_ty = ty.slicePtrFieldType(&buf, mod);
14361436 if (try lookup.typeToIndex(ptr_ty, kind)) |ptr_idx| {
14371437 self.storage = .{ .anon = undefined };
14381438 self.storage.anon.fields[0] = .{
src/codegen/llvm.zig+7-7
......@@ -1638,7 +1638,7 @@ pub const Object = struct {
16381638
16391639 if (ty.isSlice(mod)) {
16401640 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
1641 const ptr_ty = ty.slicePtrFieldType(&buf);
1641 const ptr_ty = ty.slicePtrFieldType(&buf, mod);
16421642 const len_ty = Type.usize;
16431643
16441644 const name = try ty.nameAlloc(gpa, o.module);
......@@ -2822,7 +2822,7 @@ pub const DeclGen = struct {
28222822 .Pointer => {
28232823 if (t.isSlice(mod)) {
28242824 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
2825 const ptr_type = t.slicePtrFieldType(&buf);
2825 const ptr_type = t.slicePtrFieldType(&buf, mod);
28262826
28272827 const fields: [2]*llvm.Type = .{
28282828 try dg.lowerType(ptr_type),
......@@ -3182,9 +3182,9 @@ pub const DeclGen = struct {
31823182 const param_ty = fn_info.param_types[it.zig_index - 1];
31833183 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
31843184 const ptr_ty = if (param_ty.zigTypeTag(mod) == .Optional)
3185 param_ty.optionalChild(mod).slicePtrFieldType(&buf)
3185 param_ty.optionalChild(mod).slicePtrFieldType(&buf, mod)
31863186 else
3187 param_ty.slicePtrFieldType(&buf);
3187 param_ty.slicePtrFieldType(&buf, mod);
31883188 const ptr_llvm_ty = try dg.lowerType(ptr_ty);
31893189 const len_llvm_ty = try dg.lowerType(Type.usize);
31903190
......@@ -3387,7 +3387,7 @@ pub const DeclGen = struct {
33873387 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
33883388 const fields: [2]*llvm.Value = .{
33893389 try dg.lowerValue(.{
3390 .ty = tv.ty.slicePtrFieldType(&buf),
3390 .ty = tv.ty.slicePtrFieldType(&buf, mod),
33913391 .val = slice.ptr,
33923392 }),
33933393 try dg.lowerValue(.{
......@@ -4169,7 +4169,7 @@ pub const DeclGen = struct {
41694169 const mod = self.module;
41704170 if (tv.ty.isSlice(mod)) {
41714171 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
4172 const ptr_ty = tv.ty.slicePtrFieldType(&buf);
4172 const ptr_ty = tv.ty.slicePtrFieldType(&buf, mod);
41734173 var slice_len: Value.Payload.U64 = .{
41744174 .base = .{ .tag = .int_u64 },
41754175 .data = tv.val.sliceLen(mod),
......@@ -6654,7 +6654,7 @@ pub const FuncGen = struct {
66546654 if (payload_ty.isSlice(mod)) {
66556655 const slice_ptr = self.builder.buildExtractValue(loaded, 0, "");
66566656 var slice_buf: Type.SlicePtrFieldTypeBuffer = undefined;
6657 const ptr_ty = try self.dg.lowerType(payload_ty.slicePtrFieldType(&slice_buf));
6657 const ptr_ty = try self.dg.lowerType(payload_ty.slicePtrFieldType(&slice_buf, mod));
66586658 return self.builder.buildICmp(pred, slice_ptr, ptr_ty.constNull(), "");
66596659 }
66606660 return self.builder.buildICmp(pred, loaded, optional_llvm_ty.constNull(), "");
src/codegen/spirv.zig+3-3
......@@ -669,7 +669,7 @@ pub const DeclGen = struct {
669669 const slice = val.castTag(.slice).?.data;
670670
671671 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
672 const ptr_ty = ty.slicePtrFieldType(&buf);
672 const ptr_ty = ty.slicePtrFieldType(&buf, mod);
673673
674674 try self.lower(ptr_ty, slice.ptr);
675675 try self.addInt(Type.usize, slice.len);
......@@ -2489,7 +2489,7 @@ pub const DeclGen = struct {
24892489 const index_id = try self.resolve(bin_op.rhs);
24902490
24912491 var slice_buf: Type.SlicePtrFieldTypeBuffer = undefined;
2492 const ptr_ty = slice_ty.slicePtrFieldType(&slice_buf);
2492 const ptr_ty = slice_ty.slicePtrFieldType(&slice_buf, mod);
24932493 const ptr_ty_ref = try self.resolveType(ptr_ty, .direct);
24942494
24952495 const slice_ptr = try self.extractField(ptr_ty, slice_id, 0);
......@@ -2987,7 +2987,7 @@ pub const DeclGen = struct {
29872987
29882988 var ptr_buf: Type.SlicePtrFieldTypeBuffer = undefined;
29892989 const ptr_ty = if (payload_ty.isSlice(mod))
2990 payload_ty.slicePtrFieldType(&ptr_buf)
2990 payload_ty.slicePtrFieldType(&ptr_buf, mod)
29912991 else
29922992 payload_ty;
29932993
src/link/Dwarf.zig+1-1
......@@ -278,7 +278,7 @@ pub const DeclState = struct {
278278 var index = dbg_info_buffer.items.len;
279279 try dbg_info_buffer.resize(index + 4);
280280 var buf = try arena.create(Type.SlicePtrFieldTypeBuffer);
281 const ptr_ty = ty.slicePtrFieldType(buf);
281 const ptr_ty = ty.slicePtrFieldType(buf, mod);
282282 try self.addTypeRelocGlobal(atom_index, ptr_ty, @intCast(u32, index));
283283 // DW.AT.data_member_location, DW.FORM.udata
284284 try dbg_info_buffer.ensureUnusedCapacity(6);
src/type.zig+40-26
......@@ -2042,7 +2042,18 @@ pub const Type = struct {
20422042 else => unreachable,
20432043 },
20442044 else => switch (mod.intern_pool.indexToKey(ty.ip_index)) {
2045 else => @panic("TODO"),
2045 .ptr_type => |ptr_type| {
2046 if (ptr_type.alignment != 0) {
2047 return @intCast(u32, ptr_type.alignment);
2048 } else if (opt_sema) |sema| {
2049 const res = try ptr_type.elem_type.toType().abiAlignmentAdvanced(mod, .{ .sema = sema });
2050 return res.scalar;
2051 } else {
2052 return (ptr_type.elem_type.toType().abiAlignmentAdvanced(mod, .eager) catch unreachable).scalar;
2053 }
2054 },
2055 .opt_type => |child| return child.toType().ptrAlignmentAdvanced(mod, opt_sema),
2056 else => unreachable,
20462057 },
20472058 }
20482059 }
......@@ -3060,33 +3071,36 @@ pub const Type = struct {
30603071 pointer: Payload.Pointer,
30613072 };
30623073
3063 pub fn slicePtrFieldType(self: Type, buffer: *SlicePtrFieldTypeBuffer) Type {
3064 switch (self.tag()) {
3065 .pointer => {
3066 const payload = self.castTag(.pointer).?.data;
3067 assert(payload.size == .Slice);
3068
3069 buffer.* = .{
3070 .pointer = .{
3071 .data = .{
3072 .pointee_type = payload.pointee_type,
3073 .sentinel = payload.sentinel,
3074 .@"align" = payload.@"align",
3075 .@"addrspace" = payload.@"addrspace",
3076 .bit_offset = payload.bit_offset,
3077 .host_size = payload.host_size,
3078 .vector_index = payload.vector_index,
3079 .@"allowzero" = payload.@"allowzero",
3080 .mutable = payload.mutable,
3081 .@"volatile" = payload.@"volatile",
3082 .size = .Many,
3074 pub fn slicePtrFieldType(ty: Type, buffer: *SlicePtrFieldTypeBuffer, mod: *const Module) Type {
3075 switch (ty.ip_index) {
3076 .none => switch (ty.tag()) {
3077 .pointer => {
3078 const payload = ty.castTag(.pointer).?.data;
3079 assert(payload.size == .Slice);
3080
3081 buffer.* = .{
3082 .pointer = .{
3083 .data = .{
3084 .pointee_type = payload.pointee_type,
3085 .sentinel = payload.sentinel,
3086 .@"align" = payload.@"align",
3087 .@"addrspace" = payload.@"addrspace",
3088 .bit_offset = payload.bit_offset,
3089 .host_size = payload.host_size,
3090 .vector_index = payload.vector_index,
3091 .@"allowzero" = payload.@"allowzero",
3092 .mutable = payload.mutable,
3093 .@"volatile" = payload.@"volatile",
3094 .size = .Many,
3095 },
30833096 },
3084 },
3085 };
3086 return Type.initPayload(&buffer.pointer.base);
3087 },
3097 };
3098 return Type.initPayload(&buffer.pointer.base);
3099 },
30883100
3089 else => unreachable,
3101 else => unreachable,
3102 },
3103 else => return mod.intern_pool.slicePtrType(ty.ip_index).toType(),
30903104 }
30913105 }
30923106
src/value.zig+4-4
......@@ -2078,7 +2078,7 @@ pub const Value = struct {
20782078 }
20792079
20802080 var ptr_buf: Type.SlicePtrFieldTypeBuffer = undefined;
2081 const ptr_ty = ty.slicePtrFieldType(&ptr_buf);
2081 const ptr_ty = ty.slicePtrFieldType(&ptr_buf, mod);
20822082
20832083 return eqlAdvanced(a_payload.ptr, ptr_ty, b_payload.ptr, ptr_ty, mod, opt_sema);
20842084 },
......@@ -2237,7 +2237,7 @@ pub const Value = struct {
22372237 }
22382238
22392239 var ptr_buf: Type.SlicePtrFieldTypeBuffer = undefined;
2240 const ptr_ty = ty.slicePtrFieldType(&ptr_buf);
2240 const ptr_ty = ty.slicePtrFieldType(&ptr_buf, mod);
22412241 const a_ptr = switch (a_ty.ptrSize(mod)) {
22422242 .Slice => a.slicePtr(),
22432243 .One => a,
......@@ -2376,7 +2376,7 @@ pub const Value = struct {
23762376 .slice => {
23772377 const slice = val.castTag(.slice).?.data;
23782378 var ptr_buf: Type.SlicePtrFieldTypeBuffer = undefined;
2379 const ptr_ty = ty.slicePtrFieldType(&ptr_buf);
2379 const ptr_ty = ty.slicePtrFieldType(&ptr_buf, mod);
23802380 hash(slice.ptr, ptr_ty, hasher, mod);
23812381 hash(slice.len, Type.usize, hasher, mod);
23822382 },
......@@ -2499,7 +2499,7 @@ pub const Value = struct {
24992499 .slice => {
25002500 const slice = val.castTag(.slice).?.data;
25012501 var ptr_buf: Type.SlicePtrFieldTypeBuffer = undefined;
2502 const ptr_ty = ty.slicePtrFieldType(&ptr_buf);
2502 const ptr_ty = ty.slicePtrFieldType(&ptr_buf, mod);
25032503 slice.ptr.hashUncoerced(ptr_ty, hasher, mod);
25042504 },
25052505 else => val.hashPtr(hasher, mod),