| ... | ... | @@ -1386,7 +1386,11 @@ pub const WipNav = struct { |
| 1386 | 1386 | fn enumConstValue( |
| 1387 | 1387 | wip_nav: *WipNav, |
| 1388 | 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 | 1394 | field_index: usize, |
| 1391 | 1395 | ) UpdateError!void { |
| 1392 | 1396 | const zcu = wip_nav.pt.zcu; |
| ... | ... | @@ -1396,20 +1400,15 @@ pub const WipNav = struct { |
| 1396 | 1400 | .comptime_int_type => .signed, |
| 1397 | 1401 | else => Type.fromInterned(loaded_enum.tag_ty).intInfo(zcu).signedness, |
| 1398 | 1402 | }; |
| 1399 | | try wip_nav.abbrevCode(switch (signedness) { |
| 1400 | | inline .signed, .unsigned => |ct_signedness| @field(abbrev_code, @tagName(ct_signedness)), |
| 1401 | | }); |
| 1402 | | if (loaded_enum.values.len > 0) switch (ip.indexToKey(loaded_enum.values.get(ip)[field_index]).int.storage) { |
| 1403 | | .u64 => |value| switch (signedness) { |
| 1404 | | .signed => try sleb128(diw, value), |
| 1405 | | .unsigned => try uleb128(diw, value), |
| 1406 | | }, |
| 1407 | | .i64 => |value| switch (signedness) { |
| 1408 | | .signed => try sleb128(diw, value), |
| 1409 | | .unsigned => unreachable, |
| 1410 | | }, |
| 1411 | | .big_int => |big_int| { |
| 1412 | | const bits = big_int.bitCountTwosCompForSignedness(signedness); |
| 1403 | if (loaded_enum.values.len > 0) { |
| 1404 | var big_int_space: InternPool.Key.Int.Storage.BigIntSpace = undefined; |
| 1405 | const big_int = ip.indexToKey(loaded_enum.values.get(ip)[field_index]).int.storage.toBigInt(&big_int_space); |
| 1406 | const bits = @max(1, big_int.bitCountTwosCompForSignedness(signedness)); |
| 1407 | if (bits <= 64) { |
| 1408 | try wip_nav.abbrevCode(switch (signedness) { |
| 1409 | .signed => abbrev_code.sdata, |
| 1410 | .unsigned => abbrev_code.udata, |
| 1411 | }); |
| 1413 | 1412 | try wip_nav.debug_info.ensureUnusedCapacity(wip_nav.dwarf.gpa, std.math.divCeil(usize, bits, 7) catch unreachable); |
| 1414 | 1413 | var bit: usize = 0; |
| 1415 | 1414 | var carry: u1 = 1; |
| ... | ... | @@ -1428,11 +1427,21 @@ pub const WipNav = struct { |
| 1428 | 1427 | }; |
| 1429 | 1428 | wip_nav.debug_info.appendAssumeCapacity(@as(u8, if (bit + 7 < bits) 0x80 else 0x00) | twos_comp_part); |
| 1430 | 1429 | } |
| 1431 | | }, |
| 1432 | | .lazy_align, .lazy_size => unreachable, |
| 1430 | } else { |
| 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 | 1436 | } else switch (signedness) { |
| 1434 | | .signed => try sleb128(diw, field_index), |
| 1435 | | .unsigned => try uleb128(diw, field_index), |
| 1437 | .signed => { |
| 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 | 2279 | try wip_nav.refType(Type.fromInterned(loaded_enum.tag_ty)); |
| 2271 | 2280 | for (0..loaded_enum.names.len) |field_index| { |
| 2272 | 2281 | try wip_nav.enumConstValue(loaded_enum, .{ |
| 2273 | | .signed = .signed_enum_field, |
| 2274 | | .unsigned = .unsigned_enum_field, |
| 2282 | .sdata = .signed_enum_field, |
| 2283 | .udata = .unsigned_enum_field, |
| 2284 | .block = .big_enum_field, |
| 2275 | 2285 | }, field_index); |
| 2276 | 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 | 2380 | |
| 2371 | 2381 | for (0..loaded_union.field_types.len) |field_index| { |
| 2372 | 2382 | try wip_nav.enumConstValue(loaded_tag, .{ |
| 2373 | | .signed = .signed_tagged_union_field, |
| 2374 | | .unsigned = .unsigned_tagged_union_field, |
| 2383 | .sdata = .signed_tagged_union_field, |
| 2384 | .udata = .unsigned_tagged_union_field, |
| 2385 | .block = .big_tagged_union_field, |
| 2375 | 2386 | }, field_index); |
| 2376 | 2387 | { |
| 2377 | 2388 | try wip_nav.abbrevCode(.struct_field); |
| ... | ... | @@ -2839,8 +2850,9 @@ fn updateType( |
| 2839 | 2850 | try wip_nav.refType(Type.fromInterned(loaded_enum.tag_ty)); |
| 2840 | 2851 | for (0..loaded_enum.names.len) |field_index| { |
| 2841 | 2852 | try wip_nav.enumConstValue(loaded_enum, .{ |
| 2842 | | .signed = .signed_enum_field, |
| 2843 | | .unsigned = .unsigned_enum_field, |
| 2853 | .sdata = .signed_enum_field, |
| 2854 | .udata = .unsigned_enum_field, |
| 2855 | .block = .big_enum_field, |
| 2844 | 2856 | }, field_index); |
| 2845 | 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 | 3087 | try wip_nav.refType(Type.fromInterned(loaded_enum.tag_ty)); |
| 3076 | 3088 | for (0..loaded_enum.names.len) |field_index| { |
| 3077 | 3089 | try wip_nav.enumConstValue(loaded_enum, .{ |
| 3078 | | .signed = .signed_enum_field, |
| 3079 | | .unsigned = .unsigned_enum_field, |
| 3090 | .sdata = .signed_enum_field, |
| 3091 | .udata = .unsigned_enum_field, |
| 3092 | .block = .big_enum_field, |
| 3080 | 3093 | }, field_index); |
| 3081 | 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 | 3119 | |
| 3107 | 3120 | for (0..loaded_union.field_types.len) |field_index| { |
| 3108 | 3121 | try wip_nav.enumConstValue(loaded_tag, .{ |
| 3109 | | .signed = .signed_tagged_union_field, |
| 3110 | | .unsigned = .unsigned_tagged_union_field, |
| 3122 | .sdata = .signed_tagged_union_field, |
| 3123 | .udata = .unsigned_tagged_union_field, |
| 3124 | .block = .big_tagged_union_field, |
| 3111 | 3125 | }, field_index); |
| 3112 | 3126 | { |
| 3113 | 3127 | try wip_nav.abbrevCode(.struct_field); |
| ... | ... | @@ -3573,6 +3587,7 @@ const AbbrevCode = enum { |
| 3573 | 3587 | file, |
| 3574 | 3588 | signed_enum_field, |
| 3575 | 3589 | unsigned_enum_field, |
| 3590 | big_enum_field, |
| 3576 | 3591 | generated_field, |
| 3577 | 3592 | struct_field, |
| 3578 | 3593 | struct_field_comptime, |
| ... | ... | @@ -3581,6 +3596,7 @@ const AbbrevCode = enum { |
| 3581 | 3596 | tagged_union, |
| 3582 | 3597 | signed_tagged_union_field, |
| 3583 | 3598 | unsigned_tagged_union_field, |
| 3599 | big_tagged_union_field, |
| 3584 | 3600 | tagged_union_default_field, |
| 3585 | 3601 | void_type, |
| 3586 | 3602 | numeric_type, |
| ... | ... | @@ -3783,6 +3799,13 @@ const AbbrevCode = enum { |
| 3783 | 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 | 3809 | .generated_field = .{ |
| 3787 | 3810 | .tag = .member, |
| 3788 | 3811 | .attrs = &.{ |
| ... | ... | @@ -3846,6 +3869,13 @@ const AbbrevCode = enum { |
| 3846 | 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 | 3879 | .tagged_union_default_field = .{ |
| 3850 | 3880 | .tag = .variant, |
| 3851 | 3881 | .children = true, |