| ... | ... | @@ -3248,75 +3248,72 @@ fn updateLazyType( |
| 3248 | 3248 | }, |
| 3249 | 3249 | .opt_type => |opt_child_type_index| { |
| 3250 | 3250 | const opt_child_type: Type = .fromInterned(opt_child_type_index); |
| 3251 | const opt_repr = optRepr(opt_child_type, zcu); |
| 3251 | 3252 | try wip_nav.abbrevCode(.generated_union_type); |
| 3252 | 3253 | try wip_nav.strp(name); |
| 3253 | 3254 | try uleb128(diw, ty.abiSize(zcu)); |
| 3254 | 3255 | try uleb128(diw, ty.abiAlignment(zcu).toByteUnits().?); |
| 3255 | | if (opt_child_type.isNoReturn(zcu)) { |
| 3256 | | try wip_nav.abbrevCode(.generated_field); |
| 3257 | | try wip_nav.strp("null"); |
| 3258 | | try wip_nav.refType(.null); |
| 3259 | | try uleb128(diw, 0); |
| 3260 | | } else { |
| 3261 | | try wip_nav.abbrevCode(.tagged_union); |
| 3262 | | try wip_nav.infoSectionOffset( |
| 3263 | | .debug_info, |
| 3264 | | wip_nav.unit, |
| 3265 | | wip_nav.entry, |
| 3266 | | @intCast(wip_nav.debug_info.items.len + dwarf.sectionOffsetBytes()), |
| 3267 | | ); |
| 3268 | | { |
| 3256 | switch (opt_repr) { |
| 3257 | .opv_null => { |
| 3269 | 3258 | try wip_nav.abbrevCode(.generated_field); |
| 3270 | | try wip_nav.strp("has_value"); |
| 3271 | | const repr: enum { unpacked, error_set, pointer } = switch (opt_child_type_index) { |
| 3272 | | .anyerror_type => .error_set, |
| 3273 | | else => switch (ip.indexToKey(opt_child_type_index)) { |
| 3274 | | else => .unpacked, |
| 3275 | | .error_set_type, .inferred_error_set_type => .error_set, |
| 3276 | | .ptr_type => |ptr_type| if (ptr_type.flags.is_allowzero) .unpacked else .pointer, |
| 3277 | | }, |
| 3278 | | }; |
| 3279 | | switch (repr) { |
| 3280 | | .unpacked => { |
| 3281 | | try wip_nav.refType(.bool); |
| 3282 | | try uleb128(diw, if (opt_child_type.hasRuntimeBits(zcu)) |
| 3283 | | opt_child_type.abiSize(zcu) |
| 3284 | | else |
| 3285 | | 0); |
| 3286 | | }, |
| 3287 | | .error_set => { |
| 3288 | | try wip_nav.refType(.fromInterned(try pt.intern(.{ .int_type = .{ |
| 3289 | | .signedness = .unsigned, |
| 3290 | | .bits = zcu.errorSetBits(), |
| 3291 | | } }))); |
| 3292 | | try uleb128(diw, 0); |
| 3293 | | }, |
| 3294 | | .pointer => { |
| 3295 | | try wip_nav.refType(.usize); |
| 3296 | | try uleb128(diw, 0); |
| 3297 | | }, |
| 3298 | | } |
| 3299 | | |
| 3300 | | try wip_nav.abbrevCode(.unsigned_tagged_union_field); |
| 3259 | try wip_nav.strp("null"); |
| 3260 | try wip_nav.refType(.null); |
| 3301 | 3261 | try uleb128(diw, 0); |
| 3262 | }, |
| 3263 | .unpacked, .error_set, .pointer => { |
| 3264 | try wip_nav.abbrevCode(.tagged_union); |
| 3265 | try wip_nav.infoSectionOffset( |
| 3266 | .debug_info, |
| 3267 | wip_nav.unit, |
| 3268 | wip_nav.entry, |
| 3269 | @intCast(wip_nav.debug_info.items.len + dwarf.sectionOffsetBytes()), |
| 3270 | ); |
| 3302 | 3271 | { |
| 3303 | 3272 | try wip_nav.abbrevCode(.generated_field); |
| 3304 | | try wip_nav.strp("null"); |
| 3305 | | try wip_nav.refType(.null); |
| 3306 | | try uleb128(diw, 0); |
| 3307 | | } |
| 3308 | | try uleb128(diw, @intFromEnum(AbbrevCode.null)); |
| 3273 | try wip_nav.strp("has_value"); |
| 3274 | switch (opt_repr) { |
| 3275 | .opv_null => unreachable, |
| 3276 | .unpacked => { |
| 3277 | try wip_nav.refType(.bool); |
| 3278 | try uleb128(diw, if (opt_child_type.hasRuntimeBits(zcu)) |
| 3279 | opt_child_type.abiSize(zcu) |
| 3280 | else |
| 3281 | 0); |
| 3282 | }, |
| 3283 | .error_set => { |
| 3284 | try wip_nav.refType(.fromInterned(try pt.intern(.{ .int_type = .{ |
| 3285 | .signedness = .unsigned, |
| 3286 | .bits = zcu.errorSetBits(), |
| 3287 | } }))); |
| 3288 | try uleb128(diw, 0); |
| 3289 | }, |
| 3290 | .pointer => { |
| 3291 | try wip_nav.refType(.usize); |
| 3292 | try uleb128(diw, 0); |
| 3293 | }, |
| 3294 | } |
| 3309 | 3295 | |
| 3310 | | try wip_nav.abbrevCode(.tagged_union_default_field); |
| 3311 | | { |
| 3312 | | try wip_nav.abbrevCode(.generated_field); |
| 3313 | | try wip_nav.strp("?"); |
| 3314 | | try wip_nav.refType(opt_child_type); |
| 3296 | try wip_nav.abbrevCode(.unsigned_tagged_union_field); |
| 3315 | 3297 | try uleb128(diw, 0); |
| 3298 | { |
| 3299 | try wip_nav.abbrevCode(.generated_field); |
| 3300 | try wip_nav.strp("null"); |
| 3301 | try wip_nav.refType(.null); |
| 3302 | try uleb128(diw, 0); |
| 3303 | } |
| 3304 | try uleb128(diw, @intFromEnum(AbbrevCode.null)); |
| 3305 | |
| 3306 | try wip_nav.abbrevCode(.tagged_union_default_field); |
| 3307 | { |
| 3308 | try wip_nav.abbrevCode(.generated_field); |
| 3309 | try wip_nav.strp("?"); |
| 3310 | try wip_nav.refType(opt_child_type); |
| 3311 | try uleb128(diw, 0); |
| 3312 | } |
| 3313 | try uleb128(diw, @intFromEnum(AbbrevCode.null)); |
| 3316 | 3314 | } |
| 3317 | 3315 | try uleb128(diw, @intFromEnum(AbbrevCode.null)); |
| 3318 | | } |
| 3319 | | try uleb128(diw, @intFromEnum(AbbrevCode.null)); |
| 3316 | }, |
| 3320 | 3317 | } |
| 3321 | 3318 | try uleb128(diw, @intFromEnum(AbbrevCode.null)); |
| 3322 | 3319 | }, |
| ... | ... | @@ -3850,22 +3847,31 @@ fn updateLazyValue( |
| 3850 | 3847 | try uleb128(diw, @intFromEnum(AbbrevCode.null)); |
| 3851 | 3848 | }, |
| 3852 | 3849 | .opt => |opt| { |
| 3853 | | const child_type: Type = .fromInterned(ip.indexToKey(opt.ty).opt_type); |
| 3850 | const opt_child_type: Type = .fromInterned(ip.indexToKey(opt.ty).opt_type); |
| 3854 | 3851 | try wip_nav.abbrevCode(.aggregate_comptime_value); |
| 3855 | 3852 | try wip_nav.refType(.fromInterned(opt.ty)); |
| 3856 | 3853 | { |
| 3857 | 3854 | try wip_nav.abbrevCode(.comptime_value_field_runtime_bits); |
| 3858 | 3855 | try wip_nav.strp("has_value"); |
| 3859 | | if (Type.fromInterned(opt.ty).optionalReprIsPayload(zcu)) { |
| 3860 | | try wip_nav.blockValue(src_loc, .fromInterned(opt.val)); |
| 3861 | | } else { |
| 3862 | | try uleb128(diw, 1); |
| 3863 | | try diw.writeByte(@intFromBool(opt.val != .none)); |
| 3856 | switch (optRepr(opt_child_type, zcu)) { |
| 3857 | .opv_null => try uleb128(diw, 0), |
| 3858 | .unpacked => try wip_nav.blockValue(src_loc, .makeBool(opt.val != .none)), |
| 3859 | .error_set => try wip_nav.blockValue(src_loc, .fromInterned(value_index)), |
| 3860 | .pointer => if (opt_child_type.comptimeOnly(zcu)) { |
| 3861 | var buf: [8]u8 = undefined; |
| 3862 | const bytes = buf[0..@divExact(zcu.getTarget().ptrBitWidth(), 8)]; |
| 3863 | dwarf.writeInt(bytes, switch (opt.val) { |
| 3864 | .none => 0, |
| 3865 | else => opt_child_type.ptrAlignment(zcu).toByteUnits().?, |
| 3866 | }); |
| 3867 | try uleb128(diw, bytes.len); |
| 3868 | try diw.writeAll(bytes); |
| 3869 | } else try wip_nav.blockValue(src_loc, .fromInterned(value_index)), |
| 3864 | 3870 | } |
| 3865 | 3871 | } |
| 3866 | 3872 | if (opt.val != .none) child_field: { |
| 3867 | | const has_runtime_bits = child_type.hasRuntimeBits(zcu); |
| 3868 | | const has_comptime_state = child_type.comptimeOnly(zcu) and try child_type.onePossibleValue(pt) == null; |
| 3873 | const has_runtime_bits = opt_child_type.hasRuntimeBits(zcu); |
| 3874 | const has_comptime_state = opt_child_type.comptimeOnly(zcu) and try opt_child_type.onePossibleValue(pt) == null; |
| 3869 | 3875 | try wip_nav.abbrevCode(if (has_comptime_state) |
| 3870 | 3876 | .comptime_value_field_comptime_state |
| 3871 | 3877 | else if (has_runtime_bits) |
| ... | ... | @@ -3995,6 +4001,23 @@ fn updateLazyValue( |
| 3995 | 4001 | try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_info.items); |
| 3996 | 4002 | } |
| 3997 | 4003 | |
| 4004 | fn optRepr(opt_child_type: Type, zcu: *const Zcu) enum { |
| 4005 | unpacked, |
| 4006 | opv_null, |
| 4007 | error_set, |
| 4008 | pointer, |
| 4009 | } { |
| 4010 | if (opt_child_type.isNoReturn(zcu)) return .opv_null; |
| 4011 | return switch (opt_child_type.toIntern()) { |
| 4012 | .anyerror_type => .error_set, |
| 4013 | else => switch (zcu.intern_pool.indexToKey(opt_child_type.toIntern())) { |
| 4014 | else => .unpacked, |
| 4015 | .error_set_type, .inferred_error_set_type => .error_set, |
| 4016 | .ptr_type => |ptr_type| if (ptr_type.flags.is_allowzero) .unpacked else .pointer, |
| 4017 | }, |
| 4018 | }; |
| 4019 | } |
| 4020 | |
| 3998 | 4021 | pub fn updateContainerType(dwarf: *Dwarf, pt: Zcu.PerThread, type_index: InternPool.Index) UpdateError!void { |
| 3999 | 4022 | const zcu = pt.zcu; |
| 4000 | 4023 | const ip = &zcu.intern_pool; |