aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorRobin Voetter <robin@voetter.nl>2022-12-10 01:44:05 +0100
committerRobin Voetter <robin@voetter.nl>2023-04-09 01:51:52 +0200
commit27833004dbf066158ddf9574acbdef5c695941fa (patch)
tree009a7573af34ece625ad5e205d9eb4fcd3e9ef89 /src/codegen
parent3c7f93aa69e495820448a17869bd4663ed396ff2 (diff)
downloadzig-27833004dbf066158ddf9574acbdef5c695941fa.tar.gz
zig-27833004dbf066158ddf9574acbdef5c695941fa.zip
spirv: optional types
Implements lowering optional types in the SPIR-V backend.
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/spirv.zig22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig
index 1e50645c91..f81a248f63 100644
--- a/src/codegen/spirv.zig
+++ b/src/codegen/spirv.zig
@@ -776,6 +776,28 @@ pub const DeclGen = struct {
};
return try self.spv.resolveType(SpvType.initPayload(&payload.base));
},
+ .Optional => {
+ var buf: Type.Payload.ElemType = undefined;
+ const payload_ty = ty.optionalChild(&buf);
+ if (!payload_ty.hasRuntimeBitsIgnoreComptime()) {
+ // Just use a bool.
+ return try self.resolveType(Type.initTag(.bool), repr);
+ }
+
+ const payload_ty_ref = try self.resolveType(payload_ty, .indirect);
+ if (ty.optionalReprIsPayload()) {
+ // Optional is actually a pointer.
+ return payload_ty_ref;
+ }
+
+ const bool_ty_ref = try self.resolveType(Type.initTag(.bool), .indirect);
+
+ // its an actual optional
+ return try self.simpleStructType(&.{
+ .{ .ty = payload_ty_ref, .name = "payload" },
+ .{ .ty = bool_ty_ref, .name = "valid" },
+ });
+ },
.Null,
.Undefined,
.EnumLiteral,