diff options
| author | Robin Voetter <robin@voetter.nl> | 2023-09-17 13:24:29 +0200 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2023-09-23 12:36:44 -0700 |
| commit | f16d1603ab199b6e605c5e83f2edaebcf89d5512 (patch) | |
| tree | d398a622a3b63befba2b4dc7817c97fdb07d3f8b /src/codegen | |
| parent | 42226fc1b77ba042e72fcdfb1f3c1973650a7cc3 (diff) | |
| download | zig-f16d1603ab199b6e605c5e83f2edaebcf89d5512.tar.gz zig-f16d1603ab199b6e605c5e83f2edaebcf89d5512.zip | |
spirv: fix type_map use-after-realloc issues
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/spirv.zig | 55 |
1 files changed, 19 insertions, 36 deletions
diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig index 768ebea623..34ea55eaf3 100644 --- a/src/codegen/spirv.zig +++ b/src/codegen/spirv.zig @@ -947,9 +947,10 @@ pub const DeclGen = struct { return try self.resolveType(union_obj.enum_tag_ty.toType(), .indirect); } - // TODO: We need to add the active field to the key. - // const entry = try self.type_map.getOrPut(self.gpa, ty.toIntern()); - // if (entry.found_existing) return entry.value_ptr.ty_ref; + // TODO: We need to add the active field to the key, somehow. + if (maybe_active_field == null) { + if (self.type_map.get(ty.toIntern())) |info| return info.ty_ref; + } var member_types: [4]CacheRef = undefined; var member_names: [4]CacheString = undefined; @@ -986,10 +987,9 @@ pub const DeclGen = struct { .member_names = member_names[0..layout.total_fields], } }); - // entry.value_ptr.* = .{ - // .ty_ref = ty_ref, - // }; - + if (maybe_active_field == null) { + try self.type_map.put(self.gpa, ty.toIntern(), .{ .ty_ref = ty_ref }); + } return ty_ref; } @@ -1033,8 +1033,7 @@ pub const DeclGen = struct { return try self.spv.resolve(.{ .float_type = .{ .bits = bits } }); }, .Array => { - const entry = try self.type_map.getOrPut(self.gpa, ty.toIntern()); - if (entry.found_existing) return entry.value_ptr.ty_ref; + if (self.type_map.get(ty.toIntern())) |info| return info.ty_ref; const elem_ty = ty.childType(mod); const elem_ty_ref = try self.resolveType(elem_ty, .indirect); @@ -1042,15 +1041,12 @@ pub const DeclGen = struct { return self.fail("array type of {} elements is too large", .{ty.arrayLenIncludingSentinel(mod)}); }; const ty_ref = try self.spv.arrayType(total_len, elem_ty_ref); - entry.value_ptr.* = .{ - .ty_ref = ty_ref, - }; + try self.type_map.put(self.gpa, ty.toIntern(), .{ .ty_ref = ty_ref }); return ty_ref; }, .Fn => switch (repr) { .direct => { - const entry = try self.type_map.getOrPut(self.gpa, ty.toIntern()); - if (entry.found_existing) return entry.value_ptr.ty_ref; + if (self.type_map.get(ty.toIntern())) |info| return info.ty_ref; const fn_info = mod.typeToFunc(ty).?; // TODO: Put this somewhere in Sema.zig @@ -1069,10 +1065,7 @@ pub const DeclGen = struct { .parameters = param_ty_refs, } }); - entry.value_ptr.* = .{ - .ty_ref = ty_ref, - }; - + try self.type_map.put(self.gpa, ty.toIntern(), .{ .ty_ref = ty_ref }); return ty_ref; }, .indirect => { @@ -1119,8 +1112,7 @@ pub const DeclGen = struct { } }); }, .Struct => { - const entry = try self.type_map.getOrPut(self.gpa, ty.toIntern()); - if (entry.found_existing) return entry.value_ptr.ty_ref; + if (self.type_map.get(ty.toIntern())) |info| return info.ty_ref; const struct_type = switch (ip.indexToKey(ty.toIntern())) { .anon_struct_type => |tuple| { @@ -1140,9 +1132,7 @@ pub const DeclGen = struct { .member_types = member_types[0..member_index], } }); - entry.value_ptr.* = .{ - .ty_ref = ty_ref, - }; + try self.type_map.put(self.gpa, ty.toIntern(), .{ .ty_ref = ty_ref }); return ty_ref; }, .struct_type => |struct_type| struct_type, @@ -1151,6 +1141,7 @@ pub const DeclGen = struct { if (struct_type.layout == .Packed) { return try self.resolveType(struct_type.backingIntType(ip).toType(), .direct); + } var member_types = std.ArrayList(CacheRef).init(self.gpa); defer member_types.deinit(); @@ -1172,9 +1163,7 @@ pub const DeclGen = struct { .member_names = member_names.items, } }); - entry.value_ptr.* = .{ - .ty_ref = ty_ref, - }; + try self.type_map.put(self.gpa, ty.toIntern(), .{ .ty_ref = ty_ref }); return ty_ref; }, .Optional => { @@ -1192,8 +1181,7 @@ pub const DeclGen = struct { return payload_ty_ref; } - const entry = try self.type_map.getOrPut(self.gpa, ty.toIntern()); - if (entry.found_existing) return entry.value_ptr.ty_ref; + if (self.type_map.get(ty.toIntern())) |info| return info.ty_ref; const bool_ty_ref = try self.resolveType(Type.bool, .indirect); @@ -1205,9 +1193,7 @@ pub const DeclGen = struct { }, } }); - entry.value_ptr.* = .{ - .ty_ref = ty_ref, - }; + try self.type_map.put(self.gpa, ty.toIntern(), .{ .ty_ref = ty_ref }); return ty_ref; }, .Union => return try self.resolveUnionType(ty, null), @@ -1221,8 +1207,7 @@ pub const DeclGen = struct { return error_ty_ref; } - const entry = try self.type_map.getOrPut(self.gpa, ty.toIntern()); - if (entry.found_existing) return entry.value_ptr.ty_ref; + if (self.type_map.get(ty.toIntern())) |info| return info.ty_ref; const payload_ty_ref = try self.resolveType(payload_ty, .indirect); @@ -1252,9 +1237,7 @@ pub const DeclGen = struct { .member_names = &member_names, } }); - entry.value_ptr.* = .{ - .ty_ref = ty_ref, - }; + try self.type_map.put(self.gpa, ty.toIntern(), .{ .ty_ref = ty_ref }); return ty_ref; }, |
