Commit 5826a8a064

Robin Voetter <robin@voetter.nl>
2022-11-26 01:05:37
spirv: make Type.Ref stronger
Making Type.Ref an unbounded enum rather than a simple integer ensures that we don't accidently confuse this token for another type.
1 parent a60308f
Changed files (3)
src/codegen/spirv/Assembler.zig
@@ -753,7 +753,7 @@ fn parseContextDependentNumber(self: *Assembler) !void {
 
     const tok = self.currentToken();
     const result_type_ref = try self.resolveTypeRef(self.inst.operands.items[0].ref_id);
-    const result_type = self.spv.type_cache.keys()[result_type_ref];
+    const result_type = self.spv.type_cache.keys()[@enumToInt(result_type_ref)];
     switch (result_type.tag()) {
         .int => {
             const int = result_type.castTag(.int).?;
src/codegen/spirv/Module.zig
@@ -216,7 +216,7 @@ pub fn resolveType(self: *Module, ty: Type) !Type.Ref {
         result.value_ptr.* = try self.emitType(ty);
     }
 
-    return result.index;
+    return @intToEnum(Type.Ref, result.index);
 }
 
 pub fn resolveTypeId(self: *Module, ty: Type) !IdRef {
@@ -226,12 +226,12 @@ pub fn resolveTypeId(self: *Module, ty: Type) !IdRef {
 
 /// Get the result-id of a particular type, by reference. Asserts type_ref is valid.
 pub fn typeResultId(self: Module, type_ref: Type.Ref) IdResultType {
-    return self.type_cache.values()[type_ref];
+    return self.type_cache.values()[@enumToInt(type_ref)];
 }
 
 /// Get the result-id of a particular type as IdRef, by Type.Ref. Asserts type_ref is valid.
 pub fn typeRefId(self: Module, type_ref: Type.Ref) IdRef {
-    return self.type_cache.values()[type_ref].toRef();
+    return self.type_cache.values()[@enumToInt(type_ref)].toRef();
 }
 
 /// Unconditionally emit a spir-v type into the appropriate section.
src/codegen/spirv/type.zig
@@ -11,7 +11,7 @@ pub const Type = extern union {
     ptr_otherwise: *Payload,
 
     /// A reference to another SPIR-V type.
-    pub const Ref = usize;
+    pub const Ref = enum(u32) { _ };
 
     pub fn initTag(comptime small_tag: Tag) Type {
         comptime assert(@enumToInt(small_tag) < Tag.no_payload_count);