Commit 8d0f6605fe

Jacob Young <jacobly0@users.noreply.github.com>
2024-02-23 02:47:14
Builder: sync distinct bits with previous implementation
1 parent dfde194
Changed files (2)
src
codegen
src/codegen/llvm/Builder.zig
@@ -9880,7 +9880,7 @@ pub fn printUnbuffered(
                 .none, .tuple, .expression, .constant => unreachable,
                 .file => {
                     const extra = self.metadataExtraData(Metadata.File, metadata_item.data);
-                    try metadata_formatter.specialized(.@"distinct !", .DIFile, .{
+                    try metadata_formatter.specialized(.@"!", .DIFile, .{
                         .filename = extra.filename,
                         .directory = extra.directory,
                         .checksumkind = null,
@@ -9978,7 +9978,7 @@ pub fn printUnbuffered(
                 .basic_float_type,
                 => |kind| {
                     const extra = self.metadataExtraData(Metadata.BasicType, metadata_item.data);
-                    try metadata_formatter.specialized(.@"distinct !", .DIBasicType, .{
+                    try metadata_formatter.specialized(.@"!", .DIBasicType, .{
                         .tag = null,
                         .name = switch (extra.name) {
                             .none => null,
@@ -10008,7 +10008,7 @@ pub fn printUnbuffered(
                 .composite_vector_type,
                 => |kind| {
                     const extra = self.metadataExtraData(Metadata.CompositeType, metadata_item.data);
-                    try metadata_formatter.specialized(.@"distinct !", .DICompositeType, .{
+                    try metadata_formatter.specialized(.@"!", .DICompositeType, .{
                         .tag = @as(enum {
                             DW_TAG_structure_type,
                             DW_TAG_union_type,
@@ -10050,7 +10050,7 @@ pub fn printUnbuffered(
                 .derived_member_type,
                 => |kind| {
                     const extra = self.metadataExtraData(Metadata.DerivedType, metadata_item.data);
-                    try metadata_formatter.specialized(.@"distinct !", .DIDerivedType, .{
+                    try metadata_formatter.specialized(.@"!", .DIDerivedType, .{
                         .tag = @as(enum {
                             DW_TAG_pointer_type,
                             DW_TAG_member,
@@ -10081,7 +10081,7 @@ pub fn printUnbuffered(
                 },
                 .subroutine_type => {
                     const extra = self.metadataExtraData(Metadata.SubroutineType, metadata_item.data);
-                    try metadata_formatter.specialized(.@"distinct !", .DISubroutineType, .{
+                    try metadata_formatter.specialized(.@"!", .DISubroutineType, .{
                         .flags = null,
                         .cc = null,
                         .types = extra.types_tuple,
@@ -10120,7 +10120,7 @@ pub fn printUnbuffered(
                     const str = try bigint.toStringAlloc(allocator, 10, undefined);
                     defer allocator.free(str);
 
-                    try metadata_formatter.specialized(.@"distinct !", .DIEnumerator, .{
+                    try metadata_formatter.specialized(.@"!", .DIEnumerator, .{
                         .name = extra.name,
                         .value = str,
                         .isUnsigned = switch (kind) {
@@ -10149,7 +10149,7 @@ pub fn printUnbuffered(
                 },
                 .local_var => {
                     const extra = self.metadataExtraData(Metadata.LocalVar, metadata_item.data);
-                    try metadata_formatter.specialized(.@"distinct !", .DILocalVariable, .{
+                    try metadata_formatter.specialized(.@"!", .DILocalVariable, .{
                         .name = extra.name,
                         .arg = null,
                         .scope = extra.scope,
@@ -10163,7 +10163,7 @@ pub fn printUnbuffered(
                 },
                 .parameter => {
                     const extra = self.metadataExtraData(Metadata.Parameter, metadata_item.data);
-                    try metadata_formatter.specialized(.@"distinct !", .DILocalVariable, .{
+                    try metadata_formatter.specialized(.@"!", .DILocalVariable, .{
                         .name = extra.name,
                         .arg = extra.arg_no,
                         .scope = extra.scope,
@@ -10201,7 +10201,7 @@ pub fn printUnbuffered(
                 .global_var_expression => {
                     const extra =
                         self.metadataExtraData(Metadata.GlobalVarExpression, metadata_item.data);
-                    try metadata_formatter.specialized(.@"distinct !", .DIGlobalVariableExpression, .{
+                    try metadata_formatter.specialized(.@"!", .DIGlobalVariableExpression, .{
                         .@"var" = extra.variable,
                         .expr = extra.expression,
                     }, writer);
@@ -12623,17 +12623,35 @@ fn debugEnumeratorAssumeCapacity(
     value: std.math.big.int.Const,
 ) Metadata {
     assert(!self.strip);
-    const Key = struct { tag: Metadata.Tag, index: Metadata };
+    const Key = struct {
+        tag: Metadata.Tag,
+        name: MetadataString,
+        bit_width: u32,
+        value: std.math.big.int.Const,
+    };
     const Adapter = struct {
+        builder: *const Builder,
         pub fn hash(_: @This(), key: Key) u32 {
-            return @truncate(std.hash.Wyhash.hash(
-                std.hash.uint32(@intFromEnum(key.tag)),
-                std.mem.asBytes(&key.index),
-            ));
+            var hasher = std.hash.Wyhash.init(std.hash.uint32(@intFromEnum(key.tag)));
+            hasher.update(std.mem.asBytes(&key.name));
+            hasher.update(std.mem.asBytes(&key.bit_width));
+            hasher.update(std.mem.sliceAsBytes(key.value.limbs));
+            return @truncate(hasher.final());
         }
 
-        pub fn eql(_: @This(), lhs_key: Key, _: void, rhs_index: usize) bool {
-            return @intFromEnum(lhs_key.index) == rhs_index;
+        pub fn eql(ctx: @This(), lhs_key: Key, _: void, rhs_index: usize) bool {
+            if (lhs_key.tag != ctx.builder.metadata_items.items(.tag)[rhs_index]) return false;
+            const rhs_data = ctx.builder.metadata_items.items(.data)[rhs_index];
+            const rhs_extra = ctx.builder.metadataExtraData(Metadata.Enumerator, rhs_data);
+            const limbs = ctx.builder.metadata_limbs
+                .items[rhs_extra.limbs_index..][0..rhs_extra.limbs_len];
+            const rhs_value = std.math.big.int.Const{
+                .limbs = limbs,
+                .positive = lhs_key.value.positive,
+            };
+            return lhs_key.name == rhs_extra.name and
+                lhs_key.bit_width == rhs_extra.bit_width and
+                lhs_key.value.eql(rhs_value);
         }
     };
 
@@ -12647,8 +12665,13 @@ fn debugEnumeratorAssumeCapacity(
     assert(!(tag == .enumerator_unsigned and !value.positive));
 
     const gop = self.metadata_map.getOrPutAssumeCapacityAdapted(
-        Key{ .tag = tag, .index = @enumFromInt(self.metadata_map.count()) },
-        Adapter{},
+        Key{
+            .tag = tag,
+            .name = name,
+            .bit_width = bit_width,
+            .value = value,
+        },
+        Adapter{ .builder = self },
     );
 
     if (!gop.found_existing) {
src/codegen/llvm/ir.zig
@@ -873,7 +873,7 @@ pub const MetadataBlock = struct {
         pub const id = 14;
 
         pub const Flags = packed struct(u3) {
-            distinct: bool = true,
+            distinct: bool = false,
             unsigned: bool,
             bigint: bool,
         };