authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-08-22 14:58:01-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-08-22 20:08:05-04:00
log17171cdb073b940d01eafbc07e989f5c1adf843f
treec789259097633aea233ef28c0d6ceaa3c782b471
parentf47e1e148e48eedc8c2097b489472fa900b6e334

Dwarf: fix big and zero enum values


1 files changed, 59 insertions(+), 29 deletions(-)

src/link/Dwarf.zig+59-29
...@@ -1386,7 +1386,11 @@ pub const WipNav = struct {...@@ -1386,7 +1386,11 @@ pub const WipNav = struct {
1386 fn enumConstValue(1386 fn enumConstValue(
1387 wip_nav: *WipNav,1387 wip_nav: *WipNav,
1388 loaded_enum: InternPool.LoadedEnumType,1388 loaded_enum: InternPool.LoadedEnumType,
1389 abbrev_code: std.enums.EnumFieldStruct(std.builtin.Signedness, AbbrevCode, null),1389 abbrev_code: struct {
1390 sdata: AbbrevCode,
1391 udata: AbbrevCode,
1392 block: AbbrevCode,
1393 },
1390 field_index: usize,1394 field_index: usize,
1391 ) UpdateError!void {1395 ) UpdateError!void {
1392 const zcu = wip_nav.pt.zcu;1396 const zcu = wip_nav.pt.zcu;
...@@ -1396,20 +1400,15 @@ pub const WipNav = struct {...@@ -1396,20 +1400,15 @@ pub const WipNav = struct {
1396 .comptime_int_type => .signed,1400 .comptime_int_type => .signed,
1397 else => Type.fromInterned(loaded_enum.tag_ty).intInfo(zcu).signedness,1401 else => Type.fromInterned(loaded_enum.tag_ty).intInfo(zcu).signedness,
1398 };1402 };
1399 try wip_nav.abbrevCode(switch (signedness) {1403 if (loaded_enum.values.len > 0) {
1400 inline .signed, .unsigned => |ct_signedness| @field(abbrev_code, @tagName(ct_signedness)),1404 var big_int_space: InternPool.Key.Int.Storage.BigIntSpace = undefined;
1401 });1405 const big_int = ip.indexToKey(loaded_enum.values.get(ip)[field_index]).int.storage.toBigInt(&big_int_space);
1402 if (loaded_enum.values.len > 0) switch (ip.indexToKey(loaded_enum.values.get(ip)[field_index]).int.storage) {1406 const bits = @max(1, big_int.bitCountTwosCompForSignedness(signedness));
1403 .u64 => |value| switch (signedness) {1407 if (bits <= 64) {
1404 .signed => try sleb128(diw, value),1408 try wip_nav.abbrevCode(switch (signedness) {
1405 .unsigned => try uleb128(diw, value),1409 .signed => abbrev_code.sdata,
1406 },1410 .unsigned => abbrev_code.udata,
1407 .i64 => |value| switch (signedness) {1411 });
1408 .signed => try sleb128(diw, value),
1409 .unsigned => unreachable,
1410 },
1411 .big_int => |big_int| {
1412 const bits = big_int.bitCountTwosCompForSignedness(signedness);
1413 try wip_nav.debug_info.ensureUnusedCapacity(wip_nav.dwarf.gpa, std.math.divCeil(usize, bits, 7) catch unreachable);1412 try wip_nav.debug_info.ensureUnusedCapacity(wip_nav.dwarf.gpa, std.math.divCeil(usize, bits, 7) catch unreachable);
1414 var bit: usize = 0;1413 var bit: usize = 0;
1415 var carry: u1 = 1;1414 var carry: u1 = 1;
...@@ -1428,11 +1427,21 @@ pub const WipNav = struct {...@@ -1428,11 +1427,21 @@ pub const WipNav = struct {
1428 };1427 };
1429 wip_nav.debug_info.appendAssumeCapacity(@as(u8, if (bit + 7 < bits) 0x80 else 0x00) | twos_comp_part);1428 wip_nav.debug_info.appendAssumeCapacity(@as(u8, if (bit + 7 < bits) 0x80 else 0x00) | twos_comp_part);
1430 }1429 }
1431 },1430 } else {
1432 .lazy_align, .lazy_size => unreachable,1431 try wip_nav.abbrevCode(abbrev_code.block);
1432 const bytes = Type.fromInterned(loaded_enum.tag_ty).abiSize(wip_nav.pt);
1433 try uleb128(diw, bytes);
1434 big_int.writeTwosComplement(try wip_nav.debug_info.addManyAsSlice(wip_nav.dwarf.gpa, @intCast(bytes)), wip_nav.dwarf.endian);
1435 }
1433 } else switch (signedness) {1436 } else switch (signedness) {
1434 .signed => try sleb128(diw, field_index),1437 .signed => {
1435 .unsigned => try uleb128(diw, field_index),1438 try wip_nav.abbrevCode(abbrev_code.sdata);
1439 try sleb128(diw, field_index);
1440 },
1441 .unsigned => {
1442 try wip_nav.abbrevCode(abbrev_code.udata);
1443 try uleb128(diw, field_index);
1444 },
1436 }1445 }
1437 }1446 }
14381447
...@@ -2270,8 +2279,9 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -2270,8 +2279,9 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
2270 try wip_nav.refType(Type.fromInterned(loaded_enum.tag_ty));2279 try wip_nav.refType(Type.fromInterned(loaded_enum.tag_ty));
2271 for (0..loaded_enum.names.len) |field_index| {2280 for (0..loaded_enum.names.len) |field_index| {
2272 try wip_nav.enumConstValue(loaded_enum, .{2281 try wip_nav.enumConstValue(loaded_enum, .{
2273 .signed = .signed_enum_field,2282 .sdata = .signed_enum_field,
2274 .unsigned = .unsigned_enum_field,2283 .udata = .unsigned_enum_field,
2284 .block = .big_enum_field,
2275 }, field_index);2285 }, field_index);
2276 try wip_nav.strp(loaded_enum.names.get(ip)[field_index].toSlice(ip));2286 try wip_nav.strp(loaded_enum.names.get(ip)[field_index].toSlice(ip));
2277 }2287 }
...@@ -2370,8 +2380,9 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -2370,8 +2380,9 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
23702380
2371 for (0..loaded_union.field_types.len) |field_index| {2381 for (0..loaded_union.field_types.len) |field_index| {
2372 try wip_nav.enumConstValue(loaded_tag, .{2382 try wip_nav.enumConstValue(loaded_tag, .{
2373 .signed = .signed_tagged_union_field,2383 .sdata = .signed_tagged_union_field,
2374 .unsigned = .unsigned_tagged_union_field,2384 .udata = .unsigned_tagged_union_field,
2385 .block = .big_tagged_union_field,
2375 }, field_index);2386 }, field_index);
2376 {2387 {
2377 try wip_nav.abbrevCode(.struct_field);2388 try wip_nav.abbrevCode(.struct_field);
...@@ -2839,8 +2850,9 @@ fn updateType(...@@ -2839,8 +2850,9 @@ fn updateType(
2839 try wip_nav.refType(Type.fromInterned(loaded_enum.tag_ty));2850 try wip_nav.refType(Type.fromInterned(loaded_enum.tag_ty));
2840 for (0..loaded_enum.names.len) |field_index| {2851 for (0..loaded_enum.names.len) |field_index| {
2841 try wip_nav.enumConstValue(loaded_enum, .{2852 try wip_nav.enumConstValue(loaded_enum, .{
2842 .signed = .signed_enum_field,2853 .sdata = .signed_enum_field,
2843 .unsigned = .unsigned_enum_field,2854 .udata = .unsigned_enum_field,
2855 .block = .big_enum_field,
2844 }, field_index);2856 }, field_index);
2845 try wip_nav.strp(loaded_enum.names.get(ip)[field_index].toSlice(ip));2857 try wip_nav.strp(loaded_enum.names.get(ip)[field_index].toSlice(ip));
2846 }2858 }
...@@ -3075,8 +3087,9 @@ pub fn updateContainerType(dwarf: *Dwarf, pt: Zcu.PerThread, type_index: InternP...@@ -3075,8 +3087,9 @@ pub fn updateContainerType(dwarf: *Dwarf, pt: Zcu.PerThread, type_index: InternP
3075 try wip_nav.refType(Type.fromInterned(loaded_enum.tag_ty));3087 try wip_nav.refType(Type.fromInterned(loaded_enum.tag_ty));
3076 for (0..loaded_enum.names.len) |field_index| {3088 for (0..loaded_enum.names.len) |field_index| {
3077 try wip_nav.enumConstValue(loaded_enum, .{3089 try wip_nav.enumConstValue(loaded_enum, .{
3078 .signed = .signed_enum_field,3090 .sdata = .signed_enum_field,
3079 .unsigned = .unsigned_enum_field,3091 .udata = .unsigned_enum_field,
3092 .block = .big_enum_field,
3080 }, field_index);3093 }, field_index);
3081 try wip_nav.strp(loaded_enum.names.get(ip)[field_index].toSlice(ip));3094 try wip_nav.strp(loaded_enum.names.get(ip)[field_index].toSlice(ip));
3082 }3095 }
...@@ -3106,8 +3119,9 @@ pub fn updateContainerType(dwarf: *Dwarf, pt: Zcu.PerThread, type_index: InternP...@@ -3106,8 +3119,9 @@ pub fn updateContainerType(dwarf: *Dwarf, pt: Zcu.PerThread, type_index: InternP
31063119
3107 for (0..loaded_union.field_types.len) |field_index| {3120 for (0..loaded_union.field_types.len) |field_index| {
3108 try wip_nav.enumConstValue(loaded_tag, .{3121 try wip_nav.enumConstValue(loaded_tag, .{
3109 .signed = .signed_tagged_union_field,3122 .sdata = .signed_tagged_union_field,
3110 .unsigned = .unsigned_tagged_union_field,3123 .udata = .unsigned_tagged_union_field,
3124 .block = .big_tagged_union_field,
3111 }, field_index);3125 }, field_index);
3112 {3126 {
3113 try wip_nav.abbrevCode(.struct_field);3127 try wip_nav.abbrevCode(.struct_field);
...@@ -3573,6 +3587,7 @@ const AbbrevCode = enum {...@@ -3573,6 +3587,7 @@ const AbbrevCode = enum {
3573 file,3587 file,
3574 signed_enum_field,3588 signed_enum_field,
3575 unsigned_enum_field,3589 unsigned_enum_field,
3590 big_enum_field,
3576 generated_field,3591 generated_field,
3577 struct_field,3592 struct_field,
3578 struct_field_comptime,3593 struct_field_comptime,
...@@ -3581,6 +3596,7 @@ const AbbrevCode = enum {...@@ -3581,6 +3596,7 @@ const AbbrevCode = enum {
3581 tagged_union,3596 tagged_union,
3582 signed_tagged_union_field,3597 signed_tagged_union_field,
3583 unsigned_tagged_union_field,3598 unsigned_tagged_union_field,
3599 big_tagged_union_field,
3584 tagged_union_default_field,3600 tagged_union_default_field,
3585 void_type,3601 void_type,
3586 numeric_type,3602 numeric_type,
...@@ -3783,6 +3799,13 @@ const AbbrevCode = enum {...@@ -3783,6 +3799,13 @@ const AbbrevCode = enum {
3783 .{ .name, .strp },3799 .{ .name, .strp },
3784 },3800 },
3785 },3801 },
3802 .big_enum_field = .{
3803 .tag = .enumerator,
3804 .attrs = &.{
3805 .{ .const_value, .block },
3806 .{ .name, .strp },
3807 },
3808 },
3786 .generated_field = .{3809 .generated_field = .{
3787 .tag = .member,3810 .tag = .member,
3788 .attrs = &.{3811 .attrs = &.{
...@@ -3846,6 +3869,13 @@ const AbbrevCode = enum {...@@ -3846,6 +3869,13 @@ const AbbrevCode = enum {
3846 .{ .discr_value, .udata },3869 .{ .discr_value, .udata },
3847 },3870 },
3848 },3871 },
3872 .big_tagged_union_field = .{
3873 .tag = .variant,
3874 .children = true,
3875 .attrs = &.{
3876 .{ .discr_value, .block },
3877 },
3878 },
3849 .tagged_union_default_field = .{3879 .tagged_union_default_field = .{
3850 .tag = .variant,3880 .tag = .variant,
3851 .children = true,3881 .children = true,