commit cff8ab88f5ffe24771aa9c6e839eef03bc22f3d2 (tree)
parent 572517376a7695693c59a0ec4ec6cc5442003e3a
Author: Robin Voetter <robin@voetter.nl>
Date: Fri, 22 Sep 2023 19:22:44 +0200
spirv: fixes
Diffstat:
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig
@@ -771,21 +771,25 @@ pub const DeclGen = struct {
return try self.constructArray(result_ty_ref, constituents);
},
.struct_type => {
- const struct_ty = mod.typeToStruct(ty).?;
- if (struct_ty.layout == .Packed) {
+ const struct_type = mod.typeToStruct(ty).?;
+ if (struct_type.layout == .Packed) {
return self.todo("packed struct constants", .{});
}
var constituents = std.ArrayList(IdRef).init(self.gpa);
defer constituents.deinit();
- var field_it = struct_ty.runtimeFieldIterator(mod);
- while (field_it.next()) |field_and_index| {
- const field = field_and_index.field;
- const index = field_and_index.index;
+ var it = struct_type.iterateRuntimeOrder(ip);
+ while (it.next()) |field_index| {
+ const field_ty = struct_type.field_types.get(ip)[field_index].toType();
+ if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) {
+ // This is a zero-bit field - we only needed it for the alignment.
+ continue;
+ }
+
// TODO: Padding?
- const field_val = try val.fieldValue(mod, index);
- const field_id = try self.constant(field.ty, field_val, .indirect);
+ const field_val = try val.fieldValue(mod, field_index);
+ const field_id = try self.constant(field_ty, field_val, .indirect);
try constituents.append(field_id);
}