authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2022-12-10 01:44:05+01:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2023-04-09 01:51:52+02:00
log27833004dbf066158ddf9574acbdef5c695941fa
tree009a7573af34ece625ad5e205d9eb4fcd3e9ef89
parent3c7f93aa69e495820448a17869bd4663ed396ff2
signaturelock-open Commit is signed but in an unrecognized format.

spirv: optional types

Implements lowering optional types in the SPIR-V backend.

1 files changed, 22 insertions(+), 0 deletions(-)

src/codegen/spirv.zig+22
......@@ -776,6 +776,28 @@ pub const DeclGen = struct {
776776 };
777777 return try self.spv.resolveType(SpvType.initPayload(&payload.base));
778778 },
779 .Optional => {
780 var buf: Type.Payload.ElemType = undefined;
781 const payload_ty = ty.optionalChild(&buf);
782 if (!payload_ty.hasRuntimeBitsIgnoreComptime()) {
783 // Just use a bool.
784 return try self.resolveType(Type.initTag(.bool), repr);
785 }
786
787 const payload_ty_ref = try self.resolveType(payload_ty, .indirect);
788 if (ty.optionalReprIsPayload()) {
789 // Optional is actually a pointer.
790 return payload_ty_ref;
791 }
792
793 const bool_ty_ref = try self.resolveType(Type.initTag(.bool), .indirect);
794
795 // its an actual optional
796 return try self.simpleStructType(&.{
797 .{ .ty = payload_ty_ref, .name = "payload" },
798 .{ .ty = bool_ty_ref, .name = "valid" },
799 });
800 },
779801 .Null,
780802 .Undefined,
781803 .EnumLiteral,