authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-02-23 02:47:14+01:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-02-23 03:23:49+01:00
log8d0f6605fe46c2815f6275da6484d8824ee4d91a
tree932c3216ef5213bdef08bdd612d5e6df00a6c8f7
parentdfde194287b7afa66a14804fdbc43211ce52e2f7

Builder: sync distinct bits with previous implementation


2 files changed, 42 insertions(+), 19 deletions(-)

src/codegen/llvm/Builder.zig+41-18
...@@ -9880,7 +9880,7 @@ pub fn printUnbuffered(...@@ -9880,7 +9880,7 @@ pub fn printUnbuffered(
9880 .none, .tuple, .expression, .constant => unreachable,9880 .none, .tuple, .expression, .constant => unreachable,
9881 .file => {9881 .file => {
9882 const extra = self.metadataExtraData(Metadata.File, metadata_item.data);9882 const extra = self.metadataExtraData(Metadata.File, metadata_item.data);
9883 try metadata_formatter.specialized(.@"distinct !", .DIFile, .{9883 try metadata_formatter.specialized(.@"!", .DIFile, .{
9884 .filename = extra.filename,9884 .filename = extra.filename,
9885 .directory = extra.directory,9885 .directory = extra.directory,
9886 .checksumkind = null,9886 .checksumkind = null,
...@@ -9978,7 +9978,7 @@ pub fn printUnbuffered(...@@ -9978,7 +9978,7 @@ pub fn printUnbuffered(
9978 .basic_float_type,9978 .basic_float_type,
9979 => |kind| {9979 => |kind| {
9980 const extra = self.metadataExtraData(Metadata.BasicType, metadata_item.data);9980 const extra = self.metadataExtraData(Metadata.BasicType, metadata_item.data);
9981 try metadata_formatter.specialized(.@"distinct !", .DIBasicType, .{9981 try metadata_formatter.specialized(.@"!", .DIBasicType, .{
9982 .tag = null,9982 .tag = null,
9983 .name = switch (extra.name) {9983 .name = switch (extra.name) {
9984 .none => null,9984 .none => null,
...@@ -10008,7 +10008,7 @@ pub fn printUnbuffered(...@@ -10008,7 +10008,7 @@ pub fn printUnbuffered(
10008 .composite_vector_type,10008 .composite_vector_type,
10009 => |kind| {10009 => |kind| {
10010 const extra = self.metadataExtraData(Metadata.CompositeType, metadata_item.data);10010 const extra = self.metadataExtraData(Metadata.CompositeType, metadata_item.data);
10011 try metadata_formatter.specialized(.@"distinct !", .DICompositeType, .{10011 try metadata_formatter.specialized(.@"!", .DICompositeType, .{
10012 .tag = @as(enum {10012 .tag = @as(enum {
10013 DW_TAG_structure_type,10013 DW_TAG_structure_type,
10014 DW_TAG_union_type,10014 DW_TAG_union_type,
...@@ -10050,7 +10050,7 @@ pub fn printUnbuffered(...@@ -10050,7 +10050,7 @@ pub fn printUnbuffered(
10050 .derived_member_type,10050 .derived_member_type,
10051 => |kind| {10051 => |kind| {
10052 const extra = self.metadataExtraData(Metadata.DerivedType, metadata_item.data);10052 const extra = self.metadataExtraData(Metadata.DerivedType, metadata_item.data);
10053 try metadata_formatter.specialized(.@"distinct !", .DIDerivedType, .{10053 try metadata_formatter.specialized(.@"!", .DIDerivedType, .{
10054 .tag = @as(enum {10054 .tag = @as(enum {
10055 DW_TAG_pointer_type,10055 DW_TAG_pointer_type,
10056 DW_TAG_member,10056 DW_TAG_member,
...@@ -10081,7 +10081,7 @@ pub fn printUnbuffered(...@@ -10081,7 +10081,7 @@ pub fn printUnbuffered(
10081 },10081 },
10082 .subroutine_type => {10082 .subroutine_type => {
10083 const extra = self.metadataExtraData(Metadata.SubroutineType, metadata_item.data);10083 const extra = self.metadataExtraData(Metadata.SubroutineType, metadata_item.data);
10084 try metadata_formatter.specialized(.@"distinct !", .DISubroutineType, .{10084 try metadata_formatter.specialized(.@"!", .DISubroutineType, .{
10085 .flags = null,10085 .flags = null,
10086 .cc = null,10086 .cc = null,
10087 .types = extra.types_tuple,10087 .types = extra.types_tuple,
...@@ -10120,7 +10120,7 @@ pub fn printUnbuffered(...@@ -10120,7 +10120,7 @@ pub fn printUnbuffered(
10120 const str = try bigint.toStringAlloc(allocator, 10, undefined);10120 const str = try bigint.toStringAlloc(allocator, 10, undefined);
10121 defer allocator.free(str);10121 defer allocator.free(str);
1012210122
10123 try metadata_formatter.specialized(.@"distinct !", .DIEnumerator, .{10123 try metadata_formatter.specialized(.@"!", .DIEnumerator, .{
10124 .name = extra.name,10124 .name = extra.name,
10125 .value = str,10125 .value = str,
10126 .isUnsigned = switch (kind) {10126 .isUnsigned = switch (kind) {
...@@ -10149,7 +10149,7 @@ pub fn printUnbuffered(...@@ -10149,7 +10149,7 @@ pub fn printUnbuffered(
10149 },10149 },
10150 .local_var => {10150 .local_var => {
10151 const extra = self.metadataExtraData(Metadata.LocalVar, metadata_item.data);10151 const extra = self.metadataExtraData(Metadata.LocalVar, metadata_item.data);
10152 try metadata_formatter.specialized(.@"distinct !", .DILocalVariable, .{10152 try metadata_formatter.specialized(.@"!", .DILocalVariable, .{
10153 .name = extra.name,10153 .name = extra.name,
10154 .arg = null,10154 .arg = null,
10155 .scope = extra.scope,10155 .scope = extra.scope,
...@@ -10163,7 +10163,7 @@ pub fn printUnbuffered(...@@ -10163,7 +10163,7 @@ pub fn printUnbuffered(
10163 },10163 },
10164 .parameter => {10164 .parameter => {
10165 const extra = self.metadataExtraData(Metadata.Parameter, metadata_item.data);10165 const extra = self.metadataExtraData(Metadata.Parameter, metadata_item.data);
10166 try metadata_formatter.specialized(.@"distinct !", .DILocalVariable, .{10166 try metadata_formatter.specialized(.@"!", .DILocalVariable, .{
10167 .name = extra.name,10167 .name = extra.name,
10168 .arg = extra.arg_no,10168 .arg = extra.arg_no,
10169 .scope = extra.scope,10169 .scope = extra.scope,
...@@ -10201,7 +10201,7 @@ pub fn printUnbuffered(...@@ -10201,7 +10201,7 @@ pub fn printUnbuffered(
10201 .global_var_expression => {10201 .global_var_expression => {
10202 const extra =10202 const extra =
10203 self.metadataExtraData(Metadata.GlobalVarExpression, metadata_item.data);10203 self.metadataExtraData(Metadata.GlobalVarExpression, metadata_item.data);
10204 try metadata_formatter.specialized(.@"distinct !", .DIGlobalVariableExpression, .{10204 try metadata_formatter.specialized(.@"!", .DIGlobalVariableExpression, .{
10205 .@"var" = extra.variable,10205 .@"var" = extra.variable,
10206 .expr = extra.expression,10206 .expr = extra.expression,
10207 }, writer);10207 }, writer);
...@@ -12623,17 +12623,35 @@ fn debugEnumeratorAssumeCapacity(...@@ -12623,17 +12623,35 @@ fn debugEnumeratorAssumeCapacity(
12623 value: std.math.big.int.Const,12623 value: std.math.big.int.Const,
12624) Metadata {12624) Metadata {
12625 assert(!self.strip);12625 assert(!self.strip);
12626 const Key = struct { tag: Metadata.Tag, index: Metadata };12626 const Key = struct {
12627 tag: Metadata.Tag,
12628 name: MetadataString,
12629 bit_width: u32,
12630 value: std.math.big.int.Const,
12631 };
12627 const Adapter = struct {12632 const Adapter = struct {
12633 builder: *const Builder,
12628 pub fn hash(_: @This(), key: Key) u32 {12634 pub fn hash(_: @This(), key: Key) u32 {
12629 return @truncate(std.hash.Wyhash.hash(12635 var hasher = std.hash.Wyhash.init(std.hash.uint32(@intFromEnum(key.tag)));
12630 std.hash.uint32(@intFromEnum(key.tag)),12636 hasher.update(std.mem.asBytes(&key.name));
12631 std.mem.asBytes(&key.index),12637 hasher.update(std.mem.asBytes(&key.bit_width));
12632 ));12638 hasher.update(std.mem.sliceAsBytes(key.value.limbs));
12639 return @truncate(hasher.final());
12633 }12640 }
1263412641
12635 pub fn eql(_: @This(), lhs_key: Key, _: void, rhs_index: usize) bool {12642 pub fn eql(ctx: @This(), lhs_key: Key, _: void, rhs_index: usize) bool {
12636 return @intFromEnum(lhs_key.index) == rhs_index;12643 if (lhs_key.tag != ctx.builder.metadata_items.items(.tag)[rhs_index]) return false;
12644 const rhs_data = ctx.builder.metadata_items.items(.data)[rhs_index];
12645 const rhs_extra = ctx.builder.metadataExtraData(Metadata.Enumerator, rhs_data);
12646 const limbs = ctx.builder.metadata_limbs
12647 .items[rhs_extra.limbs_index..][0..rhs_extra.limbs_len];
12648 const rhs_value = std.math.big.int.Const{
12649 .limbs = limbs,
12650 .positive = lhs_key.value.positive,
12651 };
12652 return lhs_key.name == rhs_extra.name and
12653 lhs_key.bit_width == rhs_extra.bit_width and
12654 lhs_key.value.eql(rhs_value);
12637 }12655 }
12638 };12656 };
1263912657
...@@ -12647,8 +12665,13 @@ fn debugEnumeratorAssumeCapacity(...@@ -12647,8 +12665,13 @@ fn debugEnumeratorAssumeCapacity(
12647 assert(!(tag == .enumerator_unsigned and !value.positive));12665 assert(!(tag == .enumerator_unsigned and !value.positive));
1264812666
12649 const gop = self.metadata_map.getOrPutAssumeCapacityAdapted(12667 const gop = self.metadata_map.getOrPutAssumeCapacityAdapted(
12650 Key{ .tag = tag, .index = @enumFromInt(self.metadata_map.count()) },12668 Key{
12651 Adapter{},12669 .tag = tag,
12670 .name = name,
12671 .bit_width = bit_width,
12672 .value = value,
12673 },
12674 Adapter{ .builder = self },
12652 );12675 );
1265312676
12654 if (!gop.found_existing) {12677 if (!gop.found_existing) {
src/codegen/llvm/ir.zig+1-1
...@@ -873,7 +873,7 @@ pub const MetadataBlock = struct {...@@ -873,7 +873,7 @@ pub const MetadataBlock = struct {
873 pub const id = 14;873 pub const id = 14;
874874
875 pub const Flags = packed struct(u3) {875 pub const Flags = packed struct(u3) {
876 distinct: bool = true,876 distinct: bool = false,
877 unsigned: bool,877 unsigned: bool,
878 bigint: bool,878 bigint: bool,
879 };879 };