@@ -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 ;
0 commit comments