aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorRobin Voetter <robin@voetter.nl>2023-09-17 17:29:38 +0200
committerAndrew Kelley <andrew@ziglang.org>2023-09-23 12:36:56 -0700
commit6f55a689644fa85a6f650e6d33bcb882b1f507cd (patch)
tree5ead3b6635483996c5dd2758938909d190d3e303 /src/codegen
parent5dffbf32bfb0c88163d2a116b6b0f9d802dce8cc (diff)
downloadzig-6f55a689644fa85a6f650e6d33bcb882b1f507cd.tar.gz
zig-6f55a689644fa85a6f650e6d33bcb882b1f507cd.zip
spirv: air struct_field_ptr for unions
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/spirv.zig22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig
index 7ac7672cdd..8a77899bc0 100644
--- a/src/codegen/spirv.zig
+++ b/src/codegen/spirv.zig
@@ -2651,17 +2651,35 @@ pub const DeclGen = struct {
object_ptr: IdRef,
field_index: u32,
) !?IdRef {
+ const result_ty_ref = try self.resolveType(result_ptr_ty, .direct);
+
const mod = self.module;
const object_ty = object_ptr_ty.childType(mod);
switch (object_ty.zigTypeTag(mod)) {
.Struct => switch (object_ty.containerLayout(mod)) {
.Packed => unreachable, // TODO
else => {
- const result_ty_ref = try self.resolveType(result_ptr_ty, .direct);
return try self.accessChain(result_ty_ref, object_ptr, &.{field_index});
},
},
- else => unreachable, // TODO
+ .Union => switch (object_ty.containerLayout(mod)) {
+ .Packed => unreachable, // TODO
+ else => {
+ const storage_class = spvStorageClass(object_ptr_ty.ptrAddressSpace(mod));
+ const un_active_ty_ref = try self.resolveUnionType(object_ty, field_index);
+ const un_active_ptr_ty_ref = try self.spv.ptrType(un_active_ty_ref, storage_class);
+
+ const casted_id = self.spv.allocId();
+ try self.func.body.emit(self.spv.gpa, .OpBitcast, .{
+ .id_result_type = self.typeId(un_active_ptr_ty_ref),
+ .id_result = casted_id,
+ .operand = object_ptr,
+ });
+ const layout = self.unionLayout(object_ty, field_index);
+ return try self.accessChain(result_ty_ref, casted_id, &.{layout.active_field_index});
+ },
+ },
+ else => unreachable,
}
}