diff options
| author | mlugg <mlugg@mlugg.co.uk> | 2024-02-01 16:58:52 +0000 |
|---|---|---|
| committer | Matthew Lugg <mlugg@mlugg.co.uk> | 2024-02-02 11:02:03 +0000 |
| commit | 9eda6ccefce370c76209ea50dd57fe65bfe25536 (patch) | |
| tree | d5b4af496b8a6d1811788557d85e340ce26ef2bc /src/codegen | |
| parent | 5a3ae38f3b79a69cb6f4ad28934a51165cae2ef1 (diff) | |
| download | zig-9eda6ccefce370c76209ea50dd57fe65bfe25536.tar.gz zig-9eda6ccefce370c76209ea50dd57fe65bfe25536.zip | |
InternPool: use separate key for slices
This change eliminates some problematic recursive logic in InternPool,
and provides a safer API.
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/c.zig | 71 | ||||
| -rw-r--r-- | src/codegen/llvm.zig | 39 | ||||
| -rw-r--r-- | src/codegen/spirv.zig | 18 |
3 files changed, 50 insertions, 78 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 4d0566c9d8..9907a95fef 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -1207,50 +1207,35 @@ pub const DeclGen = struct { try writer.print("{x}", .{try dg.fmtIntLiteral(repr_ty, repr_val, location)}); if (!empty) try writer.writeByte(')'); }, - .ptr => |ptr| { - if (ptr.len != .none) { - if (!location.isInitializer()) { - try writer.writeByte('('); - try dg.renderType(writer, ty); - try writer.writeByte(')'); - } - try writer.writeByte('{'); - } - const ptr_location = switch (ptr.len) { - .none => location, - else => initializer_type, - }; - const ptr_ty = switch (ptr.len) { - .none => ty, - else => ty.slicePtrFieldType(mod), - }; - const ptr_val = switch (ptr.len) { - .none => val, - else => val.slicePtr(mod), - }; - switch (ptr.addr) { - .decl => |d| try dg.renderDeclValue(writer, ptr_ty, ptr_val, d, ptr_location), - .mut_decl => |md| try dg.renderDeclValue(writer, ptr_ty, ptr_val, md.decl, ptr_location), - .anon_decl => |decl_val| try dg.renderAnonDeclValue(writer, ptr_ty, ptr_val, decl_val, ptr_location), - .int => |int| { - try writer.writeAll("(("); - try dg.renderType(writer, ptr_ty); - try writer.print("){x})", .{ - try dg.fmtIntLiteral(Type.usize, Value.fromInterned(int), ptr_location), - }); - }, - .eu_payload, - .opt_payload, - .elem, - .field, - => try dg.renderParentPtr(writer, ptr_val.ip_index, ptr_location), - .comptime_field => unreachable, - } - if (ptr.len != .none) { - try writer.writeAll(", "); - try dg.renderValue(writer, Type.usize, Value.fromInterned(ptr.len), initializer_type); - try writer.writeByte('}'); + .slice => |slice| { + if (!location.isInitializer()) { + try writer.writeByte('('); + try dg.renderType(writer, ty); + try writer.writeByte(')'); } + try writer.writeByte('{'); + try dg.renderValue(writer, ty.slicePtrFieldType(mod), Value.fromInterned(slice.ptr), initializer_type); + try writer.writeAll(", "); + try dg.renderValue(writer, Type.usize, Value.fromInterned(slice.len), initializer_type); + try writer.writeByte('}'); + }, + .ptr => |ptr| switch (ptr.addr) { + .decl => |d| try dg.renderDeclValue(writer, ty, val, d, location), + .mut_decl => |md| try dg.renderDeclValue(writer, ty, val, md.decl, location), + .anon_decl => |decl_val| try dg.renderAnonDeclValue(writer, ty, val, decl_val, location), + .int => |int| { + try writer.writeAll("(("); + try dg.renderType(writer, ty); + try writer.print("){x})", .{ + try dg.fmtIntLiteral(Type.usize, Value.fromInterned(int), location), + }); + }, + .eu_payload, + .opt_payload, + .elem, + .field, + => try dg.renderParentPtr(writer, val.ip_index, location), + .comptime_field => unreachable, }, .opt => |opt| { const payload_ty = ty.optionalChild(mod); diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index a425511e51..1e63361048 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -3644,6 +3644,7 @@ pub const Object = struct { .empty_enum_value, .float, .ptr, + .slice, .opt, .aggregate, .un, @@ -3872,30 +3873,22 @@ pub const Object = struct { 128 => try o.builder.fp128Const(val.toFloat(f128, mod)), else => unreachable, }, - .ptr => |ptr| { - const ptr_ty = switch (ptr.len) { - .none => ty, - else => ty.slicePtrFieldType(mod), - }; - const ptr_val = switch (ptr.addr) { - .decl => |decl| try o.lowerDeclRefValue(ptr_ty, decl), - .mut_decl => |mut_decl| try o.lowerDeclRefValue(ptr_ty, mut_decl.decl), - .anon_decl => |anon_decl| try o.lowerAnonDeclRef(ptr_ty, anon_decl), - .int => |int| try o.lowerIntAsPtr(int), - .eu_payload, - .opt_payload, - .elem, - .field, - => try o.lowerParentPtr(val), - .comptime_field => unreachable, - }; - switch (ptr.len) { - .none => return ptr_val, - else => return o.builder.structConst(try o.lowerType(ty), &.{ - ptr_val, try o.lowerValue(ptr.len), - }), - } + .ptr => |ptr| return switch (ptr.addr) { + .decl => |decl| try o.lowerDeclRefValue(ty, decl), + .mut_decl => |mut_decl| try o.lowerDeclRefValue(ty, mut_decl.decl), + .anon_decl => |anon_decl| try o.lowerAnonDeclRef(ty, anon_decl), + .int => |int| try o.lowerIntAsPtr(int), + .eu_payload, + .opt_payload, + .elem, + .field, + => try o.lowerParentPtr(val), + .comptime_field => unreachable, }, + .slice => |slice| return o.builder.structConst(try o.lowerType(ty), &.{ + try o.lowerValue(slice.ptr), + try o.lowerValue(slice.len), + }), .opt => |opt| { comptime assert(optional_layout_version == 3); const payload_ty = ty.optionalChild(mod); diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig index fd7d2ed8d3..6c058308df 100644 --- a/src/codegen/spirv.zig +++ b/src/codegen/spirv.zig @@ -855,18 +855,12 @@ const DeclGen = struct { const int_ty = ty.intTagType(mod); return try self.constant(int_ty, int_val, repr); }, - .ptr => |ptr| { - const ptr_ty = switch (ptr.len) { - .none => ty, - else => ty.slicePtrFieldType(mod), - }; - const ptr_id = try self.constantPtr(ptr_ty, val); - if (ptr.len == .none) { - return ptr_id; - } - - const len_id = try self.constant(Type.usize, Value.fromInterned(ptr.len), .indirect); - return try self.constructStruct( + .ptr => return self.constantPtr(ty, val), + .slice => |slice| { + const ptr_ty = ty.slicePtrFieldType(mod); + const ptr_id = try self.constantPtr(ptr_ty, Value.fromInterned(slice.ptr)); + const len_id = try self.constant(Type.usize, Value.fromInterned(slice.len), .indirect); + return self.constructStruct( ty, &.{ ptr_ty, Type.usize }, &.{ ptr_id, len_id }, |
