Address Spaces: decl_ref, *?T => *T, and *(E!T) -> *T

This commit is contained in:
Robin Voetter
2021-08-20 02:53:29 +02:00
parent 6023108650
commit cd9f6001af
3 changed files with 69 additions and 5 deletions

View File

@@ -353,7 +353,7 @@ pub const Decl = struct {
/// to require re-analysis.
outdated,
},
/// Whether `typed_value`, `align_val`, `linksection_val` and `has_addrspace` are populated.
/// Whether `typed_value`, `align_val`, `linksection_val` and `addrspace` are populated.
has_tv: bool,
/// If `true` it means the `Decl` is the resource owner of the type/value associated
/// with it. That means when `Decl` is destroyed, the cleanup code should additionally
@@ -4401,6 +4401,34 @@ pub fn ptrType(
});
}
/// Create a pointer type with an explicit address space. This function might return results
/// of either simplePtrType or ptrType, depending on the address space.
/// TODO(Snektron) unify ptrType functions.
pub fn simplePtrTypeWithAddressSpace(
arena: *Allocator,
elem_ty: Type,
mutable: bool,
size: std.builtin.TypeInfo.Pointer.Size,
address_space: std.builtin.AddressSpace,
) Allocator.Error!Type {
switch (address_space) {
.generic => return simplePtrType(arena, elem_ty, mutable, size),
else => return ptrType(
arena,
elem_ty,
null,
0,
address_space,
0,
0,
mutable,
false,
false,
size,
),
}
}
pub fn optionalType(arena: *Allocator, child_type: Type) Allocator.Error!Type {
switch (child_type.tag()) {
.single_const_pointer => return Type.Tag.optional_single_const_pointer.create(