aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorRobin Voetter <robin@voetter.nl>2021-09-02 14:46:31 +0200
committerRobin Voetter <robin@voetter.nl>2021-09-20 02:29:03 +0200
commit805e1bffbdcab84717356fb1a7b375369407d9c2 (patch)
treee6d3eb330017cea8e54eda7171ed75777e3088a0 /src/type.zig
parent7da9fa6fe2e982d10ebc9c3844d1249a4eb1d514 (diff)
downloadzig-805e1bffbdcab84717356fb1a7b375369407d9c2.tar.gz
zig-805e1bffbdcab84717356fb1a7b375369407d9c2.zip
Address Spaces: Sema basics
Diffstat (limited to 'src/type.zig')
-rw-r--r--src/type.zig42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/type.zig b/src/type.zig
index 8eca352eac..647d88c60f 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -289,6 +289,7 @@ pub const Type = extern union {
.pointee_type = Type.initTag(.comptime_int),
.sentinel = null,
.@"align" = 0,
+ .@"addrspace" = .generic,
.bit_offset = 0,
.host_size = 0,
.@"allowzero" = false,
@@ -300,6 +301,7 @@ pub const Type = extern union {
.pointee_type = Type.initTag(.u8),
.sentinel = null,
.@"align" = 0,
+ .@"addrspace" = .generic,
.bit_offset = 0,
.host_size = 0,
.@"allowzero" = false,
@@ -311,6 +313,7 @@ pub const Type = extern union {
.pointee_type = self.castPointer().?.data,
.sentinel = null,
.@"align" = 0,
+ .@"addrspace" = .generic,
.bit_offset = 0,
.host_size = 0,
.@"allowzero" = false,
@@ -322,6 +325,7 @@ pub const Type = extern union {
.pointee_type = self.castPointer().?.data,
.sentinel = null,
.@"align" = 0,
+ .@"addrspace" = .generic,
.bit_offset = 0,
.host_size = 0,
.@"allowzero" = false,
@@ -333,6 +337,7 @@ pub const Type = extern union {
.pointee_type = self.castPointer().?.data,
.sentinel = null,
.@"align" = 0,
+ .@"addrspace" = .generic,
.bit_offset = 0,
.host_size = 0,
.@"allowzero" = false,
@@ -344,6 +349,7 @@ pub const Type = extern union {
.pointee_type = Type.initTag(.u8),
.sentinel = null,
.@"align" = 0,
+ .@"addrspace" = .generic,
.bit_offset = 0,
.host_size = 0,
.@"allowzero" = false,
@@ -355,6 +361,7 @@ pub const Type = extern union {
.pointee_type = self.castPointer().?.data,
.sentinel = null,
.@"align" = 0,
+ .@"addrspace" = .generic,
.bit_offset = 0,
.host_size = 0,
.@"allowzero" = false,
@@ -366,6 +373,7 @@ pub const Type = extern union {
.pointee_type = Type.initTag(.u8),
.sentinel = null,
.@"align" = 0,
+ .@"addrspace" = .generic,
.bit_offset = 0,
.host_size = 0,
.@"allowzero" = false,
@@ -377,6 +385,7 @@ pub const Type = extern union {
.pointee_type = self.castPointer().?.data,
.sentinel = null,
.@"align" = 0,
+ .@"addrspace" = .generic,
.bit_offset = 0,
.host_size = 0,
.@"allowzero" = false,
@@ -388,6 +397,7 @@ pub const Type = extern union {
.pointee_type = self.castPointer().?.data,
.sentinel = null,
.@"align" = 0,
+ .@"addrspace" = .generic,
.bit_offset = 0,
.host_size = 0,
.@"allowzero" = false,
@@ -399,6 +409,7 @@ pub const Type = extern union {
.pointee_type = self.castPointer().?.data,
.sentinel = null,
.@"align" = 0,
+ .@"addrspace" = .generic,
.bit_offset = 0,
.host_size = 0,
.@"allowzero" = false,
@@ -410,6 +421,7 @@ pub const Type = extern union {
.pointee_type = self.castPointer().?.data,
.sentinel = null,
.@"align" = 0,
+ .@"addrspace" = .generic,
.bit_offset = 0,
.host_size = 0,
.@"allowzero" = false,
@@ -462,6 +474,8 @@ pub const Type = extern union {
return false;
if (info_a.host_size != info_b.host_size)
return false;
+ if (info_a.@"addrspace" != info_b.@"addrspace")
+ return false;
const sentinel_a = info_a.sentinel;
const sentinel_b = info_b.sentinel;
@@ -516,6 +530,8 @@ pub const Type = extern union {
return false;
if (a.fnCallingConvention() != b.fnCallingConvention())
return false;
+ if (a.fnAddressSpace() != b.fnAddressSpace())
+ return false;
const a_param_len = a.fnParamLen();
const b_param_len = b.fnParamLen();
if (a_param_len != b_param_len)
@@ -822,6 +838,7 @@ pub const Type = extern union {
.return_type = try payload.return_type.copy(allocator),
.param_types = param_types,
.cc = payload.cc,
+ .@"addrspace" = payload.@"addrspace",
.is_var_args = payload.is_var_args,
.is_generic = payload.is_generic,
.comptime_params = comptime_params.ptr,
@@ -837,6 +854,7 @@ pub const Type = extern union {
.pointee_type = try payload.pointee_type.copy(allocator),
.sentinel = sent,
.@"align" = payload.@"align",
+ .@"addrspace" = payload.@"addrspace",
.bit_offset = payload.bit_offset,
.host_size = payload.host_size,
.@"allowzero" = payload.@"allowzero",
@@ -983,6 +1001,9 @@ pub const Type = extern union {
try writer.writeAll(") callconv(.");
try writer.writeAll(@tagName(payload.cc));
try writer.writeAll(") ");
+ if (payload.@"addrspace" != .generic) {
+ try writer.print("addrspace(.{s}) ", .{ @tagName(payload.@"addrspace") });
+ }
ty = payload.return_type;
continue;
},
@@ -1114,6 +1135,9 @@ pub const Type = extern union {
}
try writer.writeAll(") ");
}
+ if (payload.@"addrspace" != .generic) {
+ try writer.print("addrspace(.{s}) ", .{ @tagName(payload.@"addrspace") });
+ }
if (!payload.mutable) try writer.writeAll("const ");
if (payload.@"volatile") try writer.writeAll("volatile ");
if (payload.@"allowzero") try writer.writeAll("allowzero ");
@@ -2642,6 +2666,18 @@ pub const Type = extern union {
};
}
+ pub fn fnAddressSpace(self: Type) std.builtin.AddressSpace {
+ return switch (self.tag()) {
+ .fn_noreturn_no_args => .generic,
+ .fn_void_no_args => .generic,
+ .fn_naked_noreturn_no_args => .generic,
+ .fn_ccc_void_no_args => .generic,
+ .function => self.castTag(.function).?.data.@"addrspace",
+
+ else => unreachable,
+ };
+ }
+
pub fn fnInfo(ty: Type) Payload.Function.Data {
return switch (ty.tag()) {
.fn_noreturn_no_args => .{
@@ -2649,6 +2685,7 @@ pub const Type = extern union {
.comptime_params = undefined,
.return_type = initTag(.noreturn),
.cc = .Unspecified,
+ .@"addrspace" = .generic,
.is_var_args = false,
.is_generic = false,
},
@@ -2657,6 +2694,7 @@ pub const Type = extern union {
.comptime_params = undefined,
.return_type = initTag(.void),
.cc = .Unspecified,
+ .@"addrspace" = .generic,
.is_var_args = false,
.is_generic = false,
},
@@ -2665,6 +2703,7 @@ pub const Type = extern union {
.comptime_params = undefined,
.return_type = initTag(.noreturn),
.cc = .Naked,
+ .@"addrspace" = .generic,
.is_var_args = false,
.is_generic = false,
},
@@ -2673,6 +2712,7 @@ pub const Type = extern union {
.comptime_params = undefined,
.return_type = initTag(.void),
.cc = .C,
+ .@"addrspace" = .generic,
.is_var_args = false,
.is_generic = false,
},
@@ -3544,6 +3584,7 @@ pub const Type = extern union {
comptime_params: [*]bool,
return_type: Type,
cc: std.builtin.CallingConvention,
+ @"addrspace": std.builtin.AddressSpace,
is_var_args: bool,
is_generic: bool,
@@ -3581,6 +3622,7 @@ pub const Type = extern union {
sentinel: ?Value,
/// If zero use pointee_type.AbiAlign()
@"align": u32,
+ @"addrspace": std.builtin.AddressSpace,
bit_offset: u16,
host_size: u16,
@"allowzero": bool,