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.
This commit is contained in:
@@ -566,7 +566,7 @@ pub const DeclGen = struct {
|
||||
}
|
||||
|
||||
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
try dg.renderValue(writer, ty.slicePtrFieldType(&buf), val.slicePtr(), .Initializer);
|
||||
try dg.renderValue(writer, ty.slicePtrFieldType(&buf, mod), val.slicePtr(), .Initializer);
|
||||
|
||||
var len_pl: Value.Payload.U64 = .{
|
||||
.base = .{ .tag = .int_u64 },
|
||||
@@ -787,7 +787,7 @@ pub const DeclGen = struct {
|
||||
|
||||
try writer.writeAll("{(");
|
||||
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
const ptr_ty = ty.slicePtrFieldType(&buf);
|
||||
const ptr_ty = ty.slicePtrFieldType(&buf, mod);
|
||||
try dg.renderType(writer, ptr_ty);
|
||||
return writer.print("){x}, {0x}}}", .{try dg.fmtIntLiteral(Type.usize, val, .Other)});
|
||||
} else {
|
||||
@@ -1088,7 +1088,7 @@ pub const DeclGen = struct {
|
||||
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
|
||||
try writer.writeByte('{');
|
||||
try dg.renderValue(writer, ty.slicePtrFieldType(&buf), slice.ptr, initializer_type);
|
||||
try dg.renderValue(writer, ty.slicePtrFieldType(&buf, mod), slice.ptr, initializer_type);
|
||||
try writer.writeAll(", ");
|
||||
try dg.renderValue(writer, Type.usize, slice.len, initializer_type);
|
||||
try writer.writeByte('}');
|
||||
@@ -4107,6 +4107,7 @@ fn airMinMax(f: *Function, inst: Air.Inst.Index, operator: u8, operation: []cons
|
||||
}
|
||||
|
||||
fn airSlice(f: *Function, inst: Air.Inst.Index) !CValue {
|
||||
const mod = f.object.dg.module;
|
||||
const ty_pl = f.air.instructions.items(.data)[inst].ty_pl;
|
||||
const bin_op = f.air.extraData(Air.Bin, ty_pl.payload).data;
|
||||
|
||||
@@ -4116,7 +4117,7 @@ fn airSlice(f: *Function, inst: Air.Inst.Index) !CValue {
|
||||
|
||||
const inst_ty = f.typeOfIndex(inst);
|
||||
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
const ptr_ty = inst_ty.slicePtrFieldType(&buf);
|
||||
const ptr_ty = inst_ty.slicePtrFieldType(&buf, mod);
|
||||
|
||||
const writer = f.object.writer();
|
||||
const local = try f.allocLocal(inst, inst_ty);
|
||||
@@ -5112,7 +5113,7 @@ fn airIsNull(
|
||||
TypedValue{ .ty = payload_ty, .val = Value.zero }
|
||||
else if (payload_ty.isSlice(mod) and optional_ty.optionalReprIsPayload(mod)) rhs: {
|
||||
try writer.writeAll(".ptr");
|
||||
const slice_ptr_ty = payload_ty.slicePtrFieldType(&slice_ptr_buf);
|
||||
const slice_ptr_ty = payload_ty.slicePtrFieldType(&slice_ptr_buf, mod);
|
||||
break :rhs TypedValue{ .ty = slice_ptr_ty, .val = Value.null };
|
||||
} else rhs: {
|
||||
try writer.writeAll(".is_null");
|
||||
@@ -5845,7 +5846,7 @@ fn airArrayToSlice(f: *Function, inst: Air.Inst.Index) !CValue {
|
||||
// &(*(void *)p)[0], although LLVM does via GetElementPtr
|
||||
if (operand == .undef) {
|
||||
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
try f.writeCValue(writer, .{ .undef = inst_ty.slicePtrFieldType(&buf) }, .Initializer);
|
||||
try f.writeCValue(writer, .{ .undef = inst_ty.slicePtrFieldType(&buf, mod) }, .Initializer);
|
||||
} else if (array_ty.hasRuntimeBitsIgnoreComptime(mod)) {
|
||||
try writer.writeAll("&(");
|
||||
try f.writeCValueDeref(writer, operand);
|
||||
|
||||
@@ -1432,7 +1432,7 @@ pub const CType = extern union {
|
||||
.payload => unreachable,
|
||||
}) |fwd_idx| {
|
||||
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
const ptr_ty = ty.slicePtrFieldType(&buf);
|
||||
const ptr_ty = ty.slicePtrFieldType(&buf, mod);
|
||||
if (try lookup.typeToIndex(ptr_ty, kind)) |ptr_idx| {
|
||||
self.storage = .{ .anon = undefined };
|
||||
self.storage.anon.fields[0] = .{
|
||||
|
||||
@@ -1638,7 +1638,7 @@ pub const Object = struct {
|
||||
|
||||
if (ty.isSlice(mod)) {
|
||||
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
const ptr_ty = ty.slicePtrFieldType(&buf);
|
||||
const ptr_ty = ty.slicePtrFieldType(&buf, mod);
|
||||
const len_ty = Type.usize;
|
||||
|
||||
const name = try ty.nameAlloc(gpa, o.module);
|
||||
@@ -2822,7 +2822,7 @@ pub const DeclGen = struct {
|
||||
.Pointer => {
|
||||
if (t.isSlice(mod)) {
|
||||
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
const ptr_type = t.slicePtrFieldType(&buf);
|
||||
const ptr_type = t.slicePtrFieldType(&buf, mod);
|
||||
|
||||
const fields: [2]*llvm.Type = .{
|
||||
try dg.lowerType(ptr_type),
|
||||
@@ -3182,9 +3182,9 @@ pub const DeclGen = struct {
|
||||
const param_ty = fn_info.param_types[it.zig_index - 1];
|
||||
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
const ptr_ty = if (param_ty.zigTypeTag(mod) == .Optional)
|
||||
param_ty.optionalChild(mod).slicePtrFieldType(&buf)
|
||||
param_ty.optionalChild(mod).slicePtrFieldType(&buf, mod)
|
||||
else
|
||||
param_ty.slicePtrFieldType(&buf);
|
||||
param_ty.slicePtrFieldType(&buf, mod);
|
||||
const ptr_llvm_ty = try dg.lowerType(ptr_ty);
|
||||
const len_llvm_ty = try dg.lowerType(Type.usize);
|
||||
|
||||
@@ -3387,7 +3387,7 @@ pub const DeclGen = struct {
|
||||
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
const fields: [2]*llvm.Value = .{
|
||||
try dg.lowerValue(.{
|
||||
.ty = tv.ty.slicePtrFieldType(&buf),
|
||||
.ty = tv.ty.slicePtrFieldType(&buf, mod),
|
||||
.val = slice.ptr,
|
||||
}),
|
||||
try dg.lowerValue(.{
|
||||
@@ -4169,7 +4169,7 @@ pub const DeclGen = struct {
|
||||
const mod = self.module;
|
||||
if (tv.ty.isSlice(mod)) {
|
||||
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
const ptr_ty = tv.ty.slicePtrFieldType(&buf);
|
||||
const ptr_ty = tv.ty.slicePtrFieldType(&buf, mod);
|
||||
var slice_len: Value.Payload.U64 = .{
|
||||
.base = .{ .tag = .int_u64 },
|
||||
.data = tv.val.sliceLen(mod),
|
||||
@@ -6654,7 +6654,7 @@ pub const FuncGen = struct {
|
||||
if (payload_ty.isSlice(mod)) {
|
||||
const slice_ptr = self.builder.buildExtractValue(loaded, 0, "");
|
||||
var slice_buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
const ptr_ty = try self.dg.lowerType(payload_ty.slicePtrFieldType(&slice_buf));
|
||||
const ptr_ty = try self.dg.lowerType(payload_ty.slicePtrFieldType(&slice_buf, mod));
|
||||
return self.builder.buildICmp(pred, slice_ptr, ptr_ty.constNull(), "");
|
||||
}
|
||||
return self.builder.buildICmp(pred, loaded, optional_llvm_ty.constNull(), "");
|
||||
|
||||
@@ -669,7 +669,7 @@ pub const DeclGen = struct {
|
||||
const slice = val.castTag(.slice).?.data;
|
||||
|
||||
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
const ptr_ty = ty.slicePtrFieldType(&buf);
|
||||
const ptr_ty = ty.slicePtrFieldType(&buf, mod);
|
||||
|
||||
try self.lower(ptr_ty, slice.ptr);
|
||||
try self.addInt(Type.usize, slice.len);
|
||||
@@ -2489,7 +2489,7 @@ pub const DeclGen = struct {
|
||||
const index_id = try self.resolve(bin_op.rhs);
|
||||
|
||||
var slice_buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
const ptr_ty = slice_ty.slicePtrFieldType(&slice_buf);
|
||||
const ptr_ty = slice_ty.slicePtrFieldType(&slice_buf, mod);
|
||||
const ptr_ty_ref = try self.resolveType(ptr_ty, .direct);
|
||||
|
||||
const slice_ptr = try self.extractField(ptr_ty, slice_id, 0);
|
||||
@@ -2987,7 +2987,7 @@ pub const DeclGen = struct {
|
||||
|
||||
var ptr_buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
const ptr_ty = if (payload_ty.isSlice(mod))
|
||||
payload_ty.slicePtrFieldType(&ptr_buf)
|
||||
payload_ty.slicePtrFieldType(&ptr_buf, mod)
|
||||
else
|
||||
payload_ty;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user