| ... | @@ -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 | } |
| 1438 | | 1447 | |
| ... | @@ -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 |
| 2370 | | 2380 | |
| 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 |
| 3106 | | 3119 | |
| 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, |