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(
98809880 .none, .tuple, .expression, .constant => unreachable,
98819881 .file => {
98829882 const extra = self.metadataExtraData(Metadata.File, metadata_item.data);
9883 try metadata_formatter.specialized(.@"distinct !", .DIFile, .{
9883 try metadata_formatter.specialized(.@"!", .DIFile, .{
98849884 .filename = extra.filename,
98859885 .directory = extra.directory,
98869886 .checksumkind = null,
......@@ -9978,7 +9978,7 @@ pub fn printUnbuffered(
99789978 .basic_float_type,
99799979 => |kind| {
99809980 const extra = self.metadataExtraData(Metadata.BasicType, metadata_item.data);
9981 try metadata_formatter.specialized(.@"distinct !", .DIBasicType, .{
9981 try metadata_formatter.specialized(.@"!", .DIBasicType, .{
99829982 .tag = null,
99839983 .name = switch (extra.name) {
99849984 .none => null,
......@@ -10008,7 +10008,7 @@ pub fn printUnbuffered(
1000810008 .composite_vector_type,
1000910009 => |kind| {
1001010010 const extra = self.metadataExtraData(Metadata.CompositeType, metadata_item.data);
10011 try metadata_formatter.specialized(.@"distinct !", .DICompositeType, .{
10011 try metadata_formatter.specialized(.@"!", .DICompositeType, .{
1001210012 .tag = @as(enum {
1001310013 DW_TAG_structure_type,
1001410014 DW_TAG_union_type,
......@@ -10050,7 +10050,7 @@ pub fn printUnbuffered(
1005010050 .derived_member_type,
1005110051 => |kind| {
1005210052 const extra = self.metadataExtraData(Metadata.DerivedType, metadata_item.data);
10053 try metadata_formatter.specialized(.@"distinct !", .DIDerivedType, .{
10053 try metadata_formatter.specialized(.@"!", .DIDerivedType, .{
1005410054 .tag = @as(enum {
1005510055 DW_TAG_pointer_type,
1005610056 DW_TAG_member,
......@@ -10081,7 +10081,7 @@ pub fn printUnbuffered(
1008110081 },
1008210082 .subroutine_type => {
1008310083 const extra = self.metadataExtraData(Metadata.SubroutineType, metadata_item.data);
10084 try metadata_formatter.specialized(.@"distinct !", .DISubroutineType, .{
10084 try metadata_formatter.specialized(.@"!", .DISubroutineType, .{
1008510085 .flags = null,
1008610086 .cc = null,
1008710087 .types = extra.types_tuple,
......@@ -10120,7 +10120,7 @@ pub fn printUnbuffered(
1012010120 const str = try bigint.toStringAlloc(allocator, 10, undefined);
1012110121 defer allocator.free(str);
1012210122
10123 try metadata_formatter.specialized(.@"distinct !", .DIEnumerator, .{
10123 try metadata_formatter.specialized(.@"!", .DIEnumerator, .{
1012410124 .name = extra.name,
1012510125 .value = str,
1012610126 .isUnsigned = switch (kind) {
......@@ -10149,7 +10149,7 @@ pub fn printUnbuffered(
1014910149 },
1015010150 .local_var => {
1015110151 const extra = self.metadataExtraData(Metadata.LocalVar, metadata_item.data);
10152 try metadata_formatter.specialized(.@"distinct !", .DILocalVariable, .{
10152 try metadata_formatter.specialized(.@"!", .DILocalVariable, .{
1015310153 .name = extra.name,
1015410154 .arg = null,
1015510155 .scope = extra.scope,
......@@ -10163,7 +10163,7 @@ pub fn printUnbuffered(
1016310163 },
1016410164 .parameter => {
1016510165 const extra = self.metadataExtraData(Metadata.Parameter, metadata_item.data);
10166 try metadata_formatter.specialized(.@"distinct !", .DILocalVariable, .{
10166 try metadata_formatter.specialized(.@"!", .DILocalVariable, .{
1016710167 .name = extra.name,
1016810168 .arg = extra.arg_no,
1016910169 .scope = extra.scope,
......@@ -10201,7 +10201,7 @@ pub fn printUnbuffered(
1020110201 .global_var_expression => {
1020210202 const extra =
1020310203 self.metadataExtraData(Metadata.GlobalVarExpression, metadata_item.data);
10204 try metadata_formatter.specialized(.@"distinct !", .DIGlobalVariableExpression, .{
10204 try metadata_formatter.specialized(.@"!", .DIGlobalVariableExpression, .{
1020510205 .@"var" = extra.variable,
1020610206 .expr = extra.expression,
1020710207 }, writer);
......@@ -12623,17 +12623,35 @@ fn debugEnumeratorAssumeCapacity(
1262312623 value: std.math.big.int.Const,
1262412624) Metadata {
1262512625 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 };
1262712632 const Adapter = struct {
12633 builder: *const Builder,
1262812634 pub fn hash(_: @This(), key: Key) u32 {
12629 return @truncate(std.hash.Wyhash.hash(
12630 std.hash.uint32(@intFromEnum(key.tag)),
12631 std.mem.asBytes(&key.index),
12632 ));
12635 var hasher = std.hash.Wyhash.init(std.hash.uint32(@intFromEnum(key.tag)));
12636 hasher.update(std.mem.asBytes(&key.name));
12637 hasher.update(std.mem.asBytes(&key.bit_width));
12638 hasher.update(std.mem.sliceAsBytes(key.value.limbs));
12639 return @truncate(hasher.final());
1263312640 }
1263412641
12635 pub fn eql(_: @This(), lhs_key: Key, _: void, rhs_index: usize) bool {
12636 return @intFromEnum(lhs_key.index) == rhs_index;
12642 pub fn eql(ctx: @This(), lhs_key: Key, _: void, rhs_index: usize) bool {
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);
1263712655 }
1263812656 };
1263912657
......@@ -12647,8 +12665,13 @@ fn debugEnumeratorAssumeCapacity(
1264712665 assert(!(tag == .enumerator_unsigned and !value.positive));
1264812666
1264912667 const gop = self.metadata_map.getOrPutAssumeCapacityAdapted(
12650 Key{ .tag = tag, .index = @enumFromInt(self.metadata_map.count()) },
12651 Adapter{},
12668 Key{
12669 .tag = tag,
12670 .name = name,
12671 .bit_width = bit_width,
12672 .value = value,
12673 },
12674 Adapter{ .builder = self },
1265212675 );
1265312676
1265412677 if (!gop.found_existing) {
src/codegen/llvm/ir.zig+1-1
......@@ -873,7 +873,7 @@ pub const MetadataBlock = struct {
873873 pub const id = 14;
874874
875875 pub const Flags = packed struct(u3) {
876 distinct: bool = true,
876 distinct: bool = false,
877877 unsigned: bool,
878878 bigint: bool,
879879 };