mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 21:08:36 +00:00
stage2: implement rest of simple pointer types
This commit is contained in:
parent
eef111fe78
commit
ebfe723f3c
@ -2429,7 +2429,7 @@ pub fn analyzeDeclRef(self: *Module, scope: *Scope, src: usize, decl: *Decl) Inn
|
||||
if (decl_tv.val.tag() == .variable) {
|
||||
return self.analyzeVarRef(scope, src, decl_tv);
|
||||
}
|
||||
const ty = try self.singlePtrType(scope, src, false, decl_tv.ty);
|
||||
const ty = try self.simplePtrType(scope, src, decl_tv.ty, false, .One);
|
||||
const val_payload = try scope.arena().create(Value.Payload.DeclRef);
|
||||
val_payload.* = .{ .decl = decl };
|
||||
|
||||
@ -2442,7 +2442,7 @@ pub fn analyzeDeclRef(self: *Module, scope: *Scope, src: usize, decl: *Decl) Inn
|
||||
fn analyzeVarRef(self: *Module, scope: *Scope, src: usize, tv: TypedValue) InnerError!*Inst {
|
||||
const variable = tv.val.cast(Value.Payload.Variable).?.variable;
|
||||
|
||||
const ty = try self.singlePtrType(scope, src, variable.is_mutable, tv.ty);
|
||||
const ty = try self.singlePtrType(scope, src, variable.is_mutable, tv.ty, .One);
|
||||
if (!variable.is_mutable and !variable.is_extern) {
|
||||
const val_payload = try scope.arena().create(Value.Payload.RefVal);
|
||||
val_payload.* = .{ .val = variable.init };
|
||||
@ -2766,7 +2766,7 @@ pub fn coerce(self: *Module, scope: *Scope, dest_type: Type, inst: *Inst) !*Inst
|
||||
|
||||
// T to ?T
|
||||
if (dest_type.zigTypeTag() == .Optional) {
|
||||
var buf: Type.Payload.Pointer = undefined;
|
||||
var buf: Type.Payload.PointerSimple = undefined;
|
||||
const child_type = dest_type.optionalChild(&buf);
|
||||
if (child_type.eql(inst.ty)) {
|
||||
return self.wrapOptional(scope, dest_type, inst);
|
||||
@ -3145,10 +3145,20 @@ pub fn floatSub(self: *Module, scope: *Scope, float_type: Type, src: usize, lhs:
|
||||
return Value.initPayload(val_payload);
|
||||
}
|
||||
|
||||
pub fn singlePtrType(self: *Module, scope: *Scope, src: usize, mutable: bool, elem_ty: Type) Allocator.Error!Type {
|
||||
const type_payload = try scope.arena().create(Type.Payload.Pointer);
|
||||
pub fn simplePtrType(self: *Module, scope: *Scope, src: usize, elem_ty: Type, mutable: bool, size: std.builtin.TypeInfo.Pointer.Size) Allocator.Error!Type {
|
||||
// TODO stage1 type inference bug
|
||||
const T = Type.Tag;
|
||||
|
||||
const type_payload = try scope.arena().create(Type.Payload.PointerSimple);
|
||||
type_payload.* = .{
|
||||
.base = .{ .tag = if (mutable) .single_mut_pointer else .single_const_pointer },
|
||||
.base = .{
|
||||
.tag = switch (size) {
|
||||
.One => if (mutable) .single_mut_pointer else T.many_const_pointer,
|
||||
.Many => if (mutable) T.many_mut_pointer else T.many_const_pointer,
|
||||
.C => if (mutable) T.c_mut_pointer else T.c_const_pointer,
|
||||
else => unreachable,
|
||||
},
|
||||
},
|
||||
.pointee_type = elem_ty,
|
||||
};
|
||||
return Type.initPayload(&type_payload.base);
|
||||
@ -3157,7 +3167,7 @@ pub fn singlePtrType(self: *Module, scope: *Scope, src: usize, mutable: bool, el
|
||||
pub fn optionalType(self: *Module, scope: *Scope, child_type: Type) Allocator.Error!Type {
|
||||
return Type.initPayload(switch (child_type.tag()) {
|
||||
.single_const_pointer => blk: {
|
||||
const payload = try scope.arena().create(Type.Payload.Pointer);
|
||||
const payload = try scope.arena().create(Type.Payload.PointerSimple);
|
||||
payload.* = .{
|
||||
.base = .{ .tag = .optional_single_const_pointer },
|
||||
.pointee_type = child_type.elemType(),
|
||||
@ -3165,7 +3175,7 @@ pub fn optionalType(self: *Module, scope: *Scope, child_type: Type) Allocator.Er
|
||||
break :blk &payload.base;
|
||||
},
|
||||
.single_mut_pointer => blk: {
|
||||
const payload = try scope.arena().create(Type.Payload.Pointer);
|
||||
const payload = try scope.arena().create(Type.Payload.PointerSimple);
|
||||
payload.* = .{
|
||||
.base = .{ .tag = .optional_single_mut_pointer },
|
||||
.pointee_type = child_type.elemType(),
|
||||
|
||||
@ -577,6 +577,17 @@ fn ptrType(mod: *Module, scope: *Scope, node: *ast.Node.PtrType) InnerError!*zir
|
||||
.val = Value.initTag(.type_type),
|
||||
});
|
||||
|
||||
const size: std.builtin.TypeInfo.Pointer.Size = switch (tree.token_ids[node.op_token]) {
|
||||
.Asterisk, .AsteriskAsterisk => .One,
|
||||
// TODO stage1 type inference bug
|
||||
.LBracket => @as(std.builtin.TypeInfo.Pointer.Size, switch (tree.token_ids[node.op_token + 2]) {
|
||||
.Identifier => .C,
|
||||
.RBracket => .Many,
|
||||
else => unreachable,
|
||||
}),
|
||||
else => unreachable,
|
||||
};
|
||||
|
||||
const simple = node.ptr_info.allowzero_token == null and
|
||||
node.ptr_info.align_info == null and
|
||||
node.ptr_info.volatile_token == null and
|
||||
@ -584,13 +595,19 @@ fn ptrType(mod: *Module, scope: *Scope, node: *ast.Node.PtrType) InnerError!*zir
|
||||
|
||||
if (simple) {
|
||||
const child_type = try expr(mod, scope, .{ .ty = meta_type }, node.rhs);
|
||||
return addZIRUnOp(mod, scope, src, if (node.ptr_info.const_token == null)
|
||||
.single_mut_ptr_type
|
||||
else
|
||||
.single_const_ptr_type, child_type);
|
||||
const mutable = node.ptr_info.const_token == null;
|
||||
// TODO stage1 type inference bug
|
||||
const T = zir.Inst.Tag;
|
||||
return addZIRUnOp(mod, scope, src, switch (size) {
|
||||
.One => if (mutable) T.single_mut_ptr_type else T.single_const_ptr_type,
|
||||
.Many => if (mutable) T.many_mut_ptr_type else T.many_const_ptr_type,
|
||||
.C => if (mutable) T.c_mut_ptr_type else T.c_const_ptr_type,
|
||||
else => unreachable,
|
||||
}, child_type);
|
||||
}
|
||||
|
||||
var kw_args: std.meta.fieldInfo(zir.Inst.PtrType, "kw_args").field_type = .{};
|
||||
kw_args.size = size;
|
||||
kw_args.@"allowzero" = node.ptr_info.allowzero_token != null;
|
||||
if (node.ptr_info.align_info) |some| {
|
||||
kw_args.@"align" = try expr(mod, scope, .none, some.node);
|
||||
@ -1271,7 +1288,7 @@ fn multilineStrLiteral(mod: *Module, scope: *Scope, node: *ast.Node.MultilineStr
|
||||
i += 1;
|
||||
}
|
||||
const slice = tree.tokenSlice(line);
|
||||
mem.copy(u8, bytes[i..], slice[2..slice.len - 1]);
|
||||
mem.copy(u8, bytes[i..], slice[2 .. slice.len - 1]);
|
||||
i += slice.len - 3;
|
||||
}
|
||||
|
||||
|
||||
@ -2060,7 +2060,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
|
||||
if (typed_value.val.isNull())
|
||||
return MCValue{ .immediate = 0 };
|
||||
|
||||
var buf: Type.Payload.Pointer = undefined;
|
||||
var buf: Type.Payload.PointerSimple = undefined;
|
||||
return self.genTypedValue(src, .{
|
||||
.ty = typed_value.ty.optionalChild(&buf),
|
||||
.val = typed_value.val,
|
||||
|
||||
@ -66,10 +66,15 @@ pub const Type = extern union {
|
||||
.function => return .Fn,
|
||||
|
||||
.array, .array_u8_sentinel_0, .array_u8, .array_sentinel => return .Array,
|
||||
.single_const_pointer => return .Pointer,
|
||||
.single_mut_pointer => return .Pointer,
|
||||
.single_const_pointer_to_comptime_int => return .Pointer,
|
||||
.const_slice_u8 => return .Pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
=> return .Pointer,
|
||||
|
||||
.optional,
|
||||
.optional_single_const_pointer,
|
||||
@ -108,13 +113,17 @@ pub const Type = extern union {
|
||||
return @fieldParentPtr(T, "base", self.ptr_otherwise);
|
||||
}
|
||||
|
||||
pub fn castPointer(self: Type) ?*Payload.Pointer {
|
||||
pub fn castPointer(self: Type) ?*Payload.PointerSimple {
|
||||
return switch (self.tag()) {
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.optional_single_const_pointer,
|
||||
.optional_single_mut_pointer,
|
||||
=> @fieldParentPtr(Payload.Pointer, "base", self.ptr_otherwise),
|
||||
=> @fieldParentPtr(Payload.PointerSimple, "base", self.ptr_otherwise),
|
||||
else => null,
|
||||
};
|
||||
}
|
||||
@ -198,8 +207,8 @@ pub const Type = extern union {
|
||||
return true;
|
||||
},
|
||||
.Optional => {
|
||||
var buf_a: Payload.Pointer = undefined;
|
||||
var buf_b: Payload.Pointer = undefined;
|
||||
var buf_a: Payload.PointerSimple = undefined;
|
||||
var buf_b: Payload.PointerSimple = undefined;
|
||||
return a.optionalChild(&buf_a).eql(b.optionalChild(&buf_b));
|
||||
},
|
||||
.Float,
|
||||
@ -263,7 +272,7 @@ pub const Type = extern union {
|
||||
}
|
||||
},
|
||||
.Optional => {
|
||||
var buf: Payload.Pointer = undefined;
|
||||
var buf: Payload.PointerSimple = undefined;
|
||||
std.hash.autoHash(&hasher, self.optionalChild(&buf).hash());
|
||||
},
|
||||
.Float,
|
||||
@ -374,9 +383,13 @@ pub const Type = extern union {
|
||||
.optional => return self.copyPayloadSingleField(allocator, Payload.Optional, "child_type"),
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.optional_single_mut_pointer,
|
||||
.optional_single_const_pointer,
|
||||
=> return self.copyPayloadSingleField(allocator, Payload.Pointer, "pointee_type"),
|
||||
=> return self.copyPayloadSingleField(allocator, Payload.PointerSimple, "pointee_type"),
|
||||
}
|
||||
}
|
||||
|
||||
@ -482,17 +495,41 @@ pub const Type = extern union {
|
||||
continue;
|
||||
},
|
||||
.single_const_pointer => {
|
||||
const payload = @fieldParentPtr(Payload.Pointer, "base", ty.ptr_otherwise);
|
||||
const payload = @fieldParentPtr(Payload.PointerSimple, "base", ty.ptr_otherwise);
|
||||
try out_stream.writeAll("*const ");
|
||||
ty = payload.pointee_type;
|
||||
continue;
|
||||
},
|
||||
.single_mut_pointer => {
|
||||
const payload = @fieldParentPtr(Payload.Pointer, "base", ty.ptr_otherwise);
|
||||
const payload = @fieldParentPtr(Payload.PointerSimple, "base", ty.ptr_otherwise);
|
||||
try out_stream.writeAll("*");
|
||||
ty = payload.pointee_type;
|
||||
continue;
|
||||
},
|
||||
.many_const_pointer => {
|
||||
const payload = @fieldParentPtr(Payload.PointerSimple, "base", ty.ptr_otherwise);
|
||||
try out_stream.writeAll("[*]const ");
|
||||
ty = payload.pointee_type;
|
||||
continue;
|
||||
},
|
||||
.many_mut_pointer => {
|
||||
const payload = @fieldParentPtr(Payload.PointerSimple, "base", ty.ptr_otherwise);
|
||||
try out_stream.writeAll("[*]");
|
||||
ty = payload.pointee_type;
|
||||
continue;
|
||||
},
|
||||
.c_const_pointer => {
|
||||
const payload = @fieldParentPtr(Payload.PointerSimple, "base", ty.ptr_otherwise);
|
||||
try out_stream.writeAll("[*c]const ");
|
||||
ty = payload.pointee_type;
|
||||
continue;
|
||||
},
|
||||
.c_mut_pointer => {
|
||||
const payload = @fieldParentPtr(Payload.PointerSimple, "base", ty.ptr_otherwise);
|
||||
try out_stream.writeAll("[*c]");
|
||||
ty = payload.pointee_type;
|
||||
continue;
|
||||
},
|
||||
.int_signed => {
|
||||
const payload = @fieldParentPtr(Payload.IntSigned, "base", ty.ptr_otherwise);
|
||||
return out_stream.print("i{}", .{payload.bits});
|
||||
@ -508,13 +545,13 @@ pub const Type = extern union {
|
||||
continue;
|
||||
},
|
||||
.optional_single_const_pointer => {
|
||||
const payload = @fieldParentPtr(Payload.Pointer, "base", ty.ptr_otherwise);
|
||||
const payload = @fieldParentPtr(Payload.PointerSimple, "base", ty.ptr_otherwise);
|
||||
try out_stream.writeAll("?*const ");
|
||||
ty = payload.pointee_type;
|
||||
continue;
|
||||
},
|
||||
.optional_single_mut_pointer => {
|
||||
const payload = @fieldParentPtr(Payload.Pointer, "base", ty.ptr_otherwise);
|
||||
const payload = @fieldParentPtr(Payload.PointerSimple, "base", ty.ptr_otherwise);
|
||||
try out_stream.writeAll("?*");
|
||||
ty = payload.pointee_type;
|
||||
continue;
|
||||
@ -619,6 +656,10 @@ pub const Type = extern union {
|
||||
.array_sentinel => self.elemType().hasCodeGenBits(),
|
||||
.single_const_pointer => self.elemType().hasCodeGenBits(),
|
||||
.single_mut_pointer => self.elemType().hasCodeGenBits(),
|
||||
.many_const_pointer => self.elemType().hasCodeGenBits(),
|
||||
.many_mut_pointer => self.elemType().hasCodeGenBits(),
|
||||
.c_const_pointer => self.elemType().hasCodeGenBits(),
|
||||
.c_mut_pointer => self.elemType().hasCodeGenBits(),
|
||||
.int_signed => self.cast(Payload.IntSigned).?.bits == 0,
|
||||
.int_unsigned => self.cast(Payload.IntUnsigned).?.bits == 0,
|
||||
|
||||
@ -669,6 +710,10 @@ pub const Type = extern union {
|
||||
.const_slice_u8,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.optional_single_const_pointer,
|
||||
.optional_single_mut_pointer,
|
||||
=> return @divExact(target.cpu.arch.ptrBitWidth(), 8),
|
||||
@ -704,7 +749,7 @@ pub const Type = extern union {
|
||||
},
|
||||
|
||||
.optional => {
|
||||
var buf: Payload.Pointer = undefined;
|
||||
var buf: Payload.PointerSimple = undefined;
|
||||
const child_type = self.optionalChild(&buf);
|
||||
if (!child_type.hasCodeGenBits()) return 1;
|
||||
|
||||
@ -772,6 +817,10 @@ pub const Type = extern union {
|
||||
.const_slice_u8,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.optional_single_const_pointer,
|
||||
.optional_single_mut_pointer,
|
||||
=> return @divExact(target.cpu.arch.ptrBitWidth(), 8),
|
||||
@ -805,7 +854,7 @@ pub const Type = extern union {
|
||||
},
|
||||
|
||||
.optional => {
|
||||
var buf: Payload.Pointer = undefined;
|
||||
var buf: Payload.PointerSimple = undefined;
|
||||
const child_type = self.optionalChild(&buf);
|
||||
if (!child_type.hasCodeGenBits()) return 1;
|
||||
|
||||
@ -872,6 +921,10 @@ pub const Type = extern union {
|
||||
.optional_single_mut_pointer,
|
||||
.optional_single_const_pointer,
|
||||
.enum_literal,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
=> false,
|
||||
|
||||
.single_const_pointer,
|
||||
@ -922,6 +975,10 @@ pub const Type = extern union {
|
||||
.array_u8_sentinel_0,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.fn_noreturn_no_args,
|
||||
.fn_void_no_args,
|
||||
@ -987,6 +1044,8 @@ pub const Type = extern union {
|
||||
.int_unsigned,
|
||||
.int_signed,
|
||||
.single_mut_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_mut_pointer,
|
||||
.optional,
|
||||
.optional_single_mut_pointer,
|
||||
.optional_single_const_pointer,
|
||||
@ -994,6 +1053,8 @@ pub const Type = extern union {
|
||||
=> false,
|
||||
|
||||
.single_const_pointer,
|
||||
.many_const_pointer,
|
||||
.c_const_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
=> true,
|
||||
@ -1048,6 +1109,10 @@ pub const Type = extern union {
|
||||
.int_signed,
|
||||
.single_mut_pointer,
|
||||
.single_const_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.optional,
|
||||
@ -1063,7 +1128,7 @@ pub const Type = extern union {
|
||||
switch (self.tag()) {
|
||||
.optional_single_const_pointer, .optional_single_mut_pointer => return true,
|
||||
.optional => {
|
||||
var buf: Payload.Pointer = undefined;
|
||||
var buf: Payload.PointerSimple = undefined;
|
||||
const child_type = self.optionalChild(&buf);
|
||||
// optionals of zero sized pointers behave like bools
|
||||
if (!child_type.hasCodeGenBits()) return false;
|
||||
@ -1101,7 +1166,7 @@ pub const Type = extern union {
|
||||
=> return false,
|
||||
|
||||
.Optional => {
|
||||
var buf: Payload.Pointer = undefined;
|
||||
var buf: Payload.PointerSimple = undefined;
|
||||
return ty.optionalChild(&buf).isValidVarType(is_extern);
|
||||
},
|
||||
.Pointer, .Array => ty = ty.elemType(),
|
||||
@ -1166,13 +1231,17 @@ pub const Type = extern union {
|
||||
.array_sentinel => self.cast(Payload.ArraySentinel).?.elem_type,
|
||||
.single_const_pointer => self.castPointer().?.pointee_type,
|
||||
.single_mut_pointer => self.castPointer().?.pointee_type,
|
||||
.many_const_pointer => self.castPointer().?.pointee_type,
|
||||
.many_mut_pointer => self.castPointer().?.pointee_type,
|
||||
.c_const_pointer => self.castPointer().?.pointee_type,
|
||||
.c_mut_pointer => self.castPointer().?.pointee_type,
|
||||
.array_u8, .array_u8_sentinel_0, .const_slice_u8 => Type.initTag(.u8),
|
||||
.single_const_pointer_to_comptime_int => Type.initTag(.comptime_int),
|
||||
};
|
||||
}
|
||||
|
||||
/// Asserts that the type is an optional.
|
||||
pub fn optionalChild(self: Type, buf: *Payload.Pointer) Type {
|
||||
pub fn optionalChild(self: Type, buf: *Payload.PointerSimple) Type {
|
||||
return switch (self.tag()) {
|
||||
.optional => self.cast(Payload.Optional).?.child_type,
|
||||
.optional_single_mut_pointer => {
|
||||
@ -1199,7 +1268,7 @@ pub const Type = extern union {
|
||||
return switch (self.tag()) {
|
||||
.optional => self.cast(Payload.Optional).?.child_type,
|
||||
.optional_single_mut_pointer, .optional_single_const_pointer => {
|
||||
const payload = try allocator.create(Payload.Pointer);
|
||||
const payload = try allocator.create(Payload.PointerSimple);
|
||||
payload.* = .{
|
||||
.base = .{
|
||||
.tag = if (self.tag() == .optional_single_const_pointer)
|
||||
@ -1258,6 +1327,10 @@ pub const Type = extern union {
|
||||
.function,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.int_unsigned,
|
||||
@ -1318,6 +1391,10 @@ pub const Type = extern union {
|
||||
.function,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.int_unsigned,
|
||||
@ -1368,6 +1445,10 @@ pub const Type = extern union {
|
||||
.array_u8_sentinel_0,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.int_unsigned,
|
||||
@ -1429,6 +1510,10 @@ pub const Type = extern union {
|
||||
.array_u8_sentinel_0,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.int_signed,
|
||||
@ -1490,6 +1575,10 @@ pub const Type = extern union {
|
||||
.array_u8_sentinel_0,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.optional,
|
||||
@ -1549,6 +1638,10 @@ pub const Type = extern union {
|
||||
.array_u8_sentinel_0,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.int_unsigned,
|
||||
@ -1637,6 +1730,10 @@ pub const Type = extern union {
|
||||
.array_u8_sentinel_0,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.u8,
|
||||
@ -1701,6 +1798,10 @@ pub const Type = extern union {
|
||||
.array_u8_sentinel_0,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.u8,
|
||||
@ -1764,6 +1865,10 @@ pub const Type = extern union {
|
||||
.array_u8_sentinel_0,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.u8,
|
||||
@ -1827,6 +1932,10 @@ pub const Type = extern union {
|
||||
.array_u8_sentinel_0,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.u8,
|
||||
@ -1887,6 +1996,10 @@ pub const Type = extern union {
|
||||
.array_u8_sentinel_0,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.u8,
|
||||
@ -1947,6 +2060,10 @@ pub const Type = extern union {
|
||||
.array_u8_sentinel_0,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.u8,
|
||||
@ -2027,6 +2144,10 @@ pub const Type = extern union {
|
||||
.array_u8_sentinel_0,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer_to_comptime_int,
|
||||
.const_slice_u8,
|
||||
.optional,
|
||||
@ -2109,7 +2230,13 @@ pub const Type = extern union {
|
||||
ty = ty.elemType();
|
||||
continue;
|
||||
},
|
||||
.single_const_pointer, .single_mut_pointer => {
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
=> {
|
||||
const ptr = ty.castPointer().?;
|
||||
ty = ptr.pointee_type;
|
||||
continue;
|
||||
@ -2167,11 +2294,17 @@ pub const Type = extern union {
|
||||
.array_u8_sentinel_0,
|
||||
.single_const_pointer,
|
||||
.single_mut_pointer,
|
||||
.many_const_pointer,
|
||||
.many_mut_pointer,
|
||||
.optional,
|
||||
.optional_single_mut_pointer,
|
||||
.optional_single_const_pointer,
|
||||
.enum_literal,
|
||||
=> return false,
|
||||
|
||||
.c_const_pointer,
|
||||
.c_mut_pointer,
|
||||
=> return true,
|
||||
};
|
||||
}
|
||||
|
||||
@ -2231,6 +2364,10 @@ pub const Type = extern union {
|
||||
array_sentinel,
|
||||
single_const_pointer,
|
||||
single_mut_pointer,
|
||||
many_const_pointer,
|
||||
many_mut_pointer,
|
||||
c_const_pointer,
|
||||
c_mut_pointer,
|
||||
int_signed,
|
||||
int_unsigned,
|
||||
function,
|
||||
@ -2272,7 +2409,7 @@ pub const Type = extern union {
|
||||
elem_type: Type,
|
||||
};
|
||||
|
||||
pub const Pointer = struct {
|
||||
pub const PointerSimple = struct {
|
||||
base: Payload,
|
||||
|
||||
pointee_type: Type,
|
||||
|
||||
@ -198,6 +198,14 @@ pub const Inst = struct {
|
||||
single_const_ptr_type,
|
||||
/// Create a mutable pointer type based on the element type. `*T`
|
||||
single_mut_ptr_type,
|
||||
/// Create a const pointer type based on the element type. `[*]const T`
|
||||
many_const_ptr_type,
|
||||
/// Create a mutable pointer type based on the element type. `[*]T`
|
||||
many_mut_ptr_type,
|
||||
/// Create a const pointer type based on the element type. `[*c]const T`
|
||||
c_const_ptr_type,
|
||||
/// Create a mutable pointer type based on the element type. `[*c]T`
|
||||
c_mut_ptr_type,
|
||||
/// Create a pointer type with attributes
|
||||
ptr_type,
|
||||
/// Write a value to a pointer. For loading, see `deref`.
|
||||
@ -262,6 +270,10 @@ pub const Inst = struct {
|
||||
.typeof,
|
||||
.single_const_ptr_type,
|
||||
.single_mut_ptr_type,
|
||||
.many_const_ptr_type,
|
||||
.many_mut_ptr_type,
|
||||
.c_const_ptr_type,
|
||||
.c_mut_ptr_type,
|
||||
.optional_type,
|
||||
.unwrap_optional_safe,
|
||||
.unwrap_optional_unsafe,
|
||||
@ -400,6 +412,10 @@ pub const Inst = struct {
|
||||
.shr,
|
||||
.single_const_ptr_type,
|
||||
.single_mut_ptr_type,
|
||||
.many_const_ptr_type,
|
||||
.many_mut_ptr_type,
|
||||
.c_const_ptr_type,
|
||||
.c_mut_ptr_type,
|
||||
.store,
|
||||
.str,
|
||||
.sub,
|
||||
@ -859,6 +875,7 @@ pub const Inst = struct {
|
||||
@"const": bool = true,
|
||||
@"volatile": bool = false,
|
||||
sentinel: ?*Inst = null,
|
||||
size: std.builtin.TypeInfo.Pointer.Size = .One,
|
||||
},
|
||||
};
|
||||
|
||||
@ -2443,7 +2460,7 @@ const EmitZIR = struct {
|
||||
}
|
||||
},
|
||||
.Optional => {
|
||||
var buf: Type.Payload.Pointer = undefined;
|
||||
var buf: Type.Payload.PointerSimple = undefined;
|
||||
const inst = try self.arena.allocator.create(Inst.UnOp);
|
||||
inst.* = .{
|
||||
.base = .{
|
||||
|
||||
@ -51,8 +51,12 @@ pub fn analyzeInst(mod: *Module, scope: *Scope, old_inst: *zir.Inst) InnerError!
|
||||
.ref => return analyzeInstRef(mod, scope, old_inst.castTag(.ref).?),
|
||||
.ret_ptr => return analyzeInstRetPtr(mod, scope, old_inst.castTag(.ret_ptr).?),
|
||||
.ret_type => return analyzeInstRetType(mod, scope, old_inst.castTag(.ret_type).?),
|
||||
.single_const_ptr_type => return analyzeInstSingleConstPtrType(mod, scope, old_inst.castTag(.single_const_ptr_type).?),
|
||||
.single_mut_ptr_type => return analyzeInstSingleMutPtrType(mod, scope, old_inst.castTag(.single_mut_ptr_type).?),
|
||||
.single_const_ptr_type => return analyzeInstSimplePtrType(mod, scope, old_inst.castTag(.single_const_ptr_type).?, false, .One),
|
||||
.single_mut_ptr_type => return analyzeInstSimplePtrType(mod, scope, old_inst.castTag(.single_mut_ptr_type).?, true, .One),
|
||||
.many_const_ptr_type => return analyzeInstSimplePtrType(mod, scope, old_inst.castTag(.many_const_ptr_type).?, false, .Many),
|
||||
.many_mut_ptr_type => return analyzeInstSimplePtrType(mod, scope, old_inst.castTag(.many_mut_ptr_type).?, true, .Many),
|
||||
.c_const_ptr_type => return analyzeInstSimplePtrType(mod, scope, old_inst.castTag(.c_const_ptr_type).?, false, .C),
|
||||
.c_mut_ptr_type => return analyzeInstSimplePtrType(mod, scope, old_inst.castTag(.c_mut_ptr_type).?, true, .C),
|
||||
.ptr_type => return analyzeInstPtrType(mod, scope, old_inst.castTag(.ptr_type).?),
|
||||
.store => return analyzeInstStore(mod, scope, old_inst.castTag(.store).?),
|
||||
.str => return analyzeInstStr(mod, scope, old_inst.castTag(.str).?),
|
||||
@ -324,7 +328,7 @@ fn analyzeInstRetPtr(mod: *Module, scope: *Scope, inst: *zir.Inst.NoOp) InnerErr
|
||||
|
||||
fn analyzeInstRef(mod: *Module, scope: *Scope, inst: *zir.Inst.UnOp) InnerError!*Inst {
|
||||
const operand = try resolveInst(mod, scope, inst.positionals.operand);
|
||||
const ptr_type = try mod.singlePtrType(scope, inst.base.src, false, operand.ty);
|
||||
const ptr_type = try mod.simplePtrType(scope, inst.base.src, operand.ty, false, .One);
|
||||
|
||||
if (operand.value()) |val| {
|
||||
const ref_payload = try scope.arena().create(Value.Payload.RefVal);
|
||||
@ -369,7 +373,7 @@ fn analyzeInstAlloc(mod: *Module, scope: *Scope, inst: *zir.Inst.UnOp) InnerErro
|
||||
if (!var_type.isValidVarType(false)) {
|
||||
return mod.fail(scope, inst.base.src, "variable of type '{}' must be const or comptime", .{var_type});
|
||||
}
|
||||
const ptr_type = try mod.singlePtrType(scope, inst.base.src, true, var_type);
|
||||
const ptr_type = try mod.simplePtrType(scope, inst.base.src, var_type, true, .One);
|
||||
const b = try mod.requireRuntimeBlock(scope, inst.base.src);
|
||||
return mod.addNoOp(b, inst.base.src, ptr_type, .alloc);
|
||||
}
|
||||
@ -723,7 +727,7 @@ fn analyzeInstUnwrapOptional(mod: *Module, scope: *Scope, unwrap: *zir.Inst.UnOp
|
||||
}
|
||||
|
||||
const child_type = try operand.ty.elemType().optionalChildAlloc(scope.arena());
|
||||
const child_pointer = try mod.singlePtrType(scope, unwrap.base.src, operand.ty.isConstPtr(), child_type);
|
||||
const child_pointer = try mod.simplePtrType(scope, unwrap.base.src, child_type, operand.ty.isConstPtr(), .One);
|
||||
|
||||
if (operand.value()) |val| {
|
||||
if (val.isNull()) {
|
||||
@ -940,7 +944,7 @@ fn analyzeInstElemPtr(mod: *Module, scope: *Scope, inst: *zir.Inst.ElemPtr) Inne
|
||||
// required a larger index.
|
||||
const elem_ptr = try array_ptr_val.elemPtr(scope.arena(), @intCast(usize, index_u64));
|
||||
|
||||
const type_payload = try scope.arena().create(Type.Payload.Pointer);
|
||||
const type_payload = try scope.arena().create(Type.Payload.PointerSimple);
|
||||
type_payload.* = .{
|
||||
.base = .{ .tag = .single_const_pointer },
|
||||
.pointee_type = array_ptr.ty.elemType().elemType(),
|
||||
@ -1311,15 +1315,9 @@ fn analyzeDeclVal(mod: *Module, scope: *Scope, inst: *zir.Inst.DeclVal) InnerErr
|
||||
return decl;
|
||||
}
|
||||
|
||||
fn analyzeInstSingleConstPtrType(mod: *Module, scope: *Scope, inst: *zir.Inst.UnOp) InnerError!*Inst {
|
||||
fn analyzeInstSimplePtrType(mod: *Module, scope: *Scope, inst: *zir.Inst.UnOp, mutable: bool, size: std.builtin.TypeInfo.Pointer.Size) InnerError!*Inst {
|
||||
const elem_type = try resolveType(mod, scope, inst.positionals.operand);
|
||||
const ty = try mod.singlePtrType(scope, inst.base.src, false, elem_type);
|
||||
return mod.constType(scope, inst.base.src, ty);
|
||||
}
|
||||
|
||||
fn analyzeInstSingleMutPtrType(mod: *Module, scope: *Scope, inst: *zir.Inst.UnOp) InnerError!*Inst {
|
||||
const elem_type = try resolveType(mod, scope, inst.positionals.operand);
|
||||
const ty = try mod.singlePtrType(scope, inst.base.src, true, elem_type);
|
||||
const ty = try mod.simplePtrType(scope, inst.base.src, elem_type, mutable, size);
|
||||
return mod.constType(scope, inst.base.src, ty);
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user