aboutsummaryrefslogtreecommitdiff
path: root/src/InternPool.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-05-05 16:32:38 -0700
committerAndrew Kelley <andrew@ziglang.org>2023-06-10 20:42:28 -0700
commit9ec0017f460854300004ab263bf585c2d376d1fb (patch)
treedf586141cc238241a5ce4d9898a119c217baf78c /src/InternPool.zig
parent70a4b76acaef8d4062f4d5317af398929ea6c9c4 (diff)
downloadzig-9ec0017f460854300004ab263bf585c2d376d1fb.tar.gz
zig-9ec0017f460854300004ab263bf585c2d376d1fb.zip
stage2: migrate many pointer types to the InternPool
Diffstat (limited to 'src/InternPool.zig')
-rw-r--r--src/InternPool.zig41
1 files changed, 29 insertions, 12 deletions
diff --git a/src/InternPool.zig b/src/InternPool.zig
index 1da0572bd4..36afbadf3d 100644
--- a/src/InternPool.zig
+++ b/src/InternPool.zig
@@ -73,7 +73,7 @@ pub const Key = union(enum) {
/// If zero use pointee_type.abiAlignment()
/// When creating pointer types, if alignment is equal to pointee type
/// abi alignment, this value should be set to 0 instead.
- alignment: u16 = 0,
+ alignment: u64 = 0,
/// If this is non-zero it means the pointer points to a sub-byte
/// range of data, which is backed by a "host integer" with this
/// number of bytes.
@@ -90,9 +90,9 @@ pub const Key = union(enum) {
/// an appropriate value for this field.
address_space: std.builtin.AddressSpace = .generic,
- pub const VectorIndex = enum(u32) {
- none = std.math.maxInt(u32),
- runtime = std.math.maxInt(u32) - 1,
+ pub const VectorIndex = enum(u16) {
+ none = std.math.maxInt(u16),
+ runtime = std.math.maxInt(u16) - 1,
_,
};
};
@@ -806,16 +806,33 @@ pub const Pointer = struct {
sentinel: Index,
flags: Flags,
packed_offset: PackedOffset,
- vector_index: VectorIndex,
+
+ /// Stored as a power-of-two, with one special value to indicate none.
+ pub const Alignment = enum(u6) {
+ none = std.math.maxInt(u6),
+ _,
+
+ pub fn toByteUnits(a: Alignment, default: u64) u64 {
+ return switch (a) {
+ .none => default,
+ _ => @as(u64, 1) << @enumToInt(a),
+ };
+ }
+
+ pub fn fromByteUnits(n: u64) Alignment {
+ if (n == 0) return .none;
+ return @intToEnum(Alignment, @ctz(n));
+ }
+ };
pub const Flags = packed struct(u32) {
- alignment: u16,
+ size: Size,
+ alignment: Alignment,
is_const: bool,
is_volatile: bool,
is_allowzero: bool,
- size: Size,
address_space: AddressSpace,
- _: u7 = undefined,
+ vector_index: VectorIndex,
};
pub const PackedOffset = packed struct(u32) {
@@ -928,13 +945,13 @@ pub fn indexToKey(ip: InternPool, index: Index) Key {
return .{ .ptr_type = .{
.elem_type = ptr_info.child,
.sentinel = ptr_info.sentinel,
- .alignment = ptr_info.flags.alignment,
+ .alignment = ptr_info.flags.alignment.toByteUnits(0),
.size = ptr_info.flags.size,
.is_const = ptr_info.flags.is_const,
.is_volatile = ptr_info.flags.is_volatile,
.is_allowzero = ptr_info.flags.is_allowzero,
.address_space = ptr_info.flags.address_space,
- .vector_index = ptr_info.vector_index,
+ .vector_index = ptr_info.flags.vector_index,
.host_size = ptr_info.packed_offset.host_size,
.bit_offset = ptr_info.packed_offset.bit_offset,
} };
@@ -1003,18 +1020,18 @@ pub fn get(ip: *InternPool, gpa: Allocator, key: Key) Allocator.Error!Index {
.child = ptr_type.elem_type,
.sentinel = ptr_type.sentinel,
.flags = .{
- .alignment = ptr_type.alignment,
+ .alignment = Pointer.Alignment.fromByteUnits(ptr_type.alignment),
.is_const = ptr_type.is_const,
.is_volatile = ptr_type.is_volatile,
.is_allowzero = ptr_type.is_allowzero,
.size = ptr_type.size,
.address_space = ptr_type.address_space,
+ .vector_index = ptr_type.vector_index,
},
.packed_offset = .{
.host_size = ptr_type.host_size,
.bit_offset = ptr_type.bit_offset,
},
- .vector_index = ptr_type.vector_index,
}),
});
},