@@ -110,13 +110,22 @@ pub const DeclState = struct {
110
110
});
111
111
}
112
112
113
- pub fn addTypeReloc (
114
- self : * DeclState ,
115
- atom : * const Atom ,
116
- ty : Type ,
117
- offset : u32 ,
118
- addend : ? u32 ,
119
- ) ! void {
113
+ /// Adds local type relocation of the form: @offset => @this + addend
114
+ /// @this signifies the offset within the .debug_abbrev section of the containing atom.
115
+ pub fn addTypeRelocLocal (self : * DeclState , atom : * const Atom , offset : u32 , addend : u32 ) ! void {
116
+ log .debug ("{x}: @this + {x}" , .{ offset , addend });
117
+ try self .abbrev_relocs .append (self .gpa , .{
118
+ .target = null ,
119
+ .atom = atom ,
120
+ .offset = offset ,
121
+ .addend = addend ,
122
+ });
123
+ }
124
+
125
+ /// Adds global type relocation of the form: @offset => @symbol + 0
126
+ /// @symbol signifies a type abbreviation posititioned somewhere in the .debug_abbrev section
127
+ /// which we use as our target of the relocation.
128
+ pub fn addTypeRelocGlobal (self : * DeclState , atom : * const Atom , ty : Type , offset : u32 ) ! void {
120
129
const resolv = self .abbrev_resolver .getContext (ty , .{
121
130
.mod = self .mod ,
122
131
}) orelse blk : {
@@ -134,14 +143,12 @@ pub const DeclState = struct {
134
143
.mod = self .mod ,
135
144
}).? ;
136
145
};
137
- const add : u32 = addend orelse 0 ;
138
-
139
- log .debug ("{x}: @{d} + {x}" , .{ offset , resolv , add });
146
+ log .debug ("{x}: @{d} + 0" , .{ offset , resolv });
140
147
try self .abbrev_relocs .append (self .gpa , .{
141
148
.target = resolv ,
142
149
.atom = atom ,
143
150
.offset = offset ,
144
- .addend = add ,
151
+ .addend = 0 ,
145
152
});
146
153
}
147
154
@@ -213,7 +220,7 @@ pub const DeclState = struct {
213
220
// DW.AT.type, DW.FORM.ref4
214
221
var index = dbg_info_buffer .items .len ;
215
222
try dbg_info_buffer .resize (index + 4 );
216
- try self .addTypeReloc (atom , Type .bool , @intCast (u32 , index ), null );
223
+ try self .addTypeRelocGlobal (atom , Type .bool , @intCast (u32 , index ));
217
224
// DW.AT.data_member_location, DW.FORM.sdata
218
225
try dbg_info_buffer .ensureUnusedCapacity (6 );
219
226
dbg_info_buffer .appendAssumeCapacity (0 );
@@ -225,7 +232,7 @@ pub const DeclState = struct {
225
232
// DW.AT.type, DW.FORM.ref4
226
233
index = dbg_info_buffer .items .len ;
227
234
try dbg_info_buffer .resize (index + 4 );
228
- try self .addTypeReloc (atom , payload_ty , @intCast (u32 , index ), null );
235
+ try self .addTypeRelocGlobal (atom , payload_ty , @intCast (u32 , index ));
229
236
// DW.AT.data_member_location, DW.FORM.sdata
230
237
const offset = abi_size - payload_ty .abiSize (target );
231
238
try leb128 .writeULEB128 (dbg_info_buffer .writer (), offset );
@@ -254,7 +261,7 @@ pub const DeclState = struct {
254
261
try dbg_info_buffer .resize (index + 4 );
255
262
var buf = try arena .create (Type .SlicePtrFieldTypeBuffer );
256
263
const ptr_ty = ty .slicePtrFieldType (buf );
257
- try self .addTypeReloc (atom , ptr_ty , @intCast (u32 , index ), null );
264
+ try self .addTypeRelocGlobal (atom , ptr_ty , @intCast (u32 , index ));
258
265
// DW.AT.data_member_location, DW.FORM.sdata
259
266
try dbg_info_buffer .ensureUnusedCapacity (6 );
260
267
dbg_info_buffer .appendAssumeCapacity (0 );
@@ -266,7 +273,7 @@ pub const DeclState = struct {
266
273
// DW.AT.type, DW.FORM.ref4
267
274
index = dbg_info_buffer .items .len ;
268
275
try dbg_info_buffer .resize (index + 4 );
269
- try self .addTypeReloc (atom , Type .usize , @intCast (u32 , index ), null );
276
+ try self .addTypeRelocGlobal (atom , Type .usize , @intCast (u32 , index ));
270
277
// DW.AT.data_member_location, DW.FORM.sdata
271
278
try dbg_info_buffer .ensureUnusedCapacity (2 );
272
279
dbg_info_buffer .appendAssumeCapacity (@sizeOf (usize ));
@@ -278,7 +285,7 @@ pub const DeclState = struct {
278
285
// DW.AT.type, DW.FORM.ref4
279
286
const index = dbg_info_buffer .items .len ;
280
287
try dbg_info_buffer .resize (index + 4 );
281
- try self .addTypeReloc (atom , ty .childType (), @intCast (u32 , index ), null );
288
+ try self .addTypeRelocGlobal (atom , ty .childType (), @intCast (u32 , index ));
282
289
}
283
290
},
284
291
.Array = > {
@@ -289,13 +296,13 @@ pub const DeclState = struct {
289
296
// DW.AT.type, DW.FORM.ref4
290
297
var index = dbg_info_buffer .items .len ;
291
298
try dbg_info_buffer .resize (index + 4 );
292
- try self .addTypeReloc (atom , ty .childType (), @intCast (u32 , index ), null );
299
+ try self .addTypeRelocGlobal (atom , ty .childType (), @intCast (u32 , index ));
293
300
// DW.AT.subrange_type
294
301
try dbg_info_buffer .append (@enumToInt (AbbrevKind .array_dim ));
295
302
// DW.AT.type, DW.FORM.ref4
296
303
index = dbg_info_buffer .items .len ;
297
304
try dbg_info_buffer .resize (index + 4 );
298
- try self .addTypeReloc (atom , Type .usize , @intCast (u32 , index ), null );
305
+ try self .addTypeRelocGlobal (atom , Type .usize , @intCast (u32 , index ));
299
306
// DW.AT.count, DW.FORM.udata
300
307
const len = ty .arrayLenIncludingSentinel ();
301
308
try leb128 .writeULEB128 (dbg_info_buffer .writer (), len );
@@ -323,7 +330,7 @@ pub const DeclState = struct {
323
330
// DW.AT.type, DW.FORM.ref4
324
331
var index = dbg_info_buffer .items .len ;
325
332
try dbg_info_buffer .resize (index + 4 );
326
- try self .addTypeReloc (atom , field , @intCast (u32 , index ), null );
333
+ try self .addTypeRelocGlobal (atom , field , @intCast (u32 , index ));
327
334
// DW.AT.data_member_location, DW.FORM.sdata
328
335
const field_off = ty .structFieldOffset (field_index , target );
329
336
try leb128 .writeULEB128 (dbg_info_buffer .writer (), field_off );
@@ -354,7 +361,7 @@ pub const DeclState = struct {
354
361
// DW.AT.type, DW.FORM.ref4
355
362
var index = dbg_info_buffer .items .len ;
356
363
try dbg_info_buffer .resize (index + 4 );
357
- try self .addTypeReloc (atom , field .ty , @intCast (u32 , index ), null );
364
+ try self .addTypeRelocGlobal (atom , field .ty , @intCast (u32 , index ));
358
365
// DW.AT.data_member_location, DW.FORM.sdata
359
366
const field_off = ty .structFieldOffset (field_index , target );
360
367
try leb128 .writeULEB128 (dbg_info_buffer .writer (), field_off );
@@ -434,7 +441,7 @@ pub const DeclState = struct {
434
441
// DW.AT.type, DW.FORM.ref4
435
442
const inner_union_index = dbg_info_buffer .items .len ;
436
443
try dbg_info_buffer .resize (inner_union_index + 4 );
437
- try self .addTypeReloc (atom , ty , @intCast (u32 , inner_union_index ), 5 );
444
+ try self .addTypeRelocLocal (atom , @intCast (u32 , inner_union_index ), 5 );
438
445
// DW.AT.data_member_location, DW.FORM.sdata
439
446
try leb128 .writeULEB128 (dbg_info_buffer .writer (), payload_offset );
440
447
}
@@ -461,7 +468,7 @@ pub const DeclState = struct {
461
468
// DW.AT.type, DW.FORM.ref4
462
469
const index = dbg_info_buffer .items .len ;
463
470
try dbg_info_buffer .resize (index + 4 );
464
- try self .addTypeReloc (atom , field .ty , @intCast (u32 , index ), null );
471
+ try self .addTypeRelocGlobal (atom , field .ty , @intCast (u32 , index ));
465
472
// DW.AT.data_member_location, DW.FORM.sdata
466
473
try dbg_info_buffer .append (0 );
467
474
}
@@ -478,7 +485,7 @@ pub const DeclState = struct {
478
485
// DW.AT.type, DW.FORM.ref4
479
486
const index = dbg_info_buffer .items .len ;
480
487
try dbg_info_buffer .resize (index + 4 );
481
- try self .addTypeReloc (atom , union_obj .tag_ty , @intCast (u32 , index ), null );
488
+ try self .addTypeRelocGlobal (atom , union_obj .tag_ty , @intCast (u32 , index ));
482
489
// DW.AT.data_member_location, DW.FORM.sdata
483
490
try leb128 .writeULEB128 (dbg_info_buffer .writer (), tag_offset );
484
491
@@ -521,7 +528,7 @@ pub const DeclState = struct {
521
528
// DW.AT.type, DW.FORM.ref4
522
529
var index = dbg_info_buffer .items .len ;
523
530
try dbg_info_buffer .resize (index + 4 );
524
- try self .addTypeReloc (atom , payload_ty , @intCast (u32 , index ), null );
531
+ try self .addTypeRelocGlobal (atom , payload_ty , @intCast (u32 , index ));
525
532
// DW.AT.data_member_location, DW.FORM.sdata
526
533
try leb128 .writeULEB128 (dbg_info_buffer .writer (), payload_off );
527
534
@@ -534,7 +541,7 @@ pub const DeclState = struct {
534
541
// DW.AT.type, DW.FORM.ref4
535
542
index = dbg_info_buffer .items .len ;
536
543
try dbg_info_buffer .resize (index + 4 );
537
- try self .addTypeReloc (atom , error_ty , @intCast (u32 , index ), null );
544
+ try self .addTypeRelocGlobal (atom , error_ty , @intCast (u32 , index ));
538
545
// DW.AT.data_member_location, DW.FORM.sdata
539
546
try leb128 .writeULEB128 (dbg_info_buffer .writer (), error_off );
540
547
@@ -556,7 +563,9 @@ pub const AbbrevEntry = struct {
556
563
};
557
564
558
565
pub const AbbrevRelocation = struct {
559
- target : u32 ,
566
+ /// If target is null, we deal with a local relocation that is based on simple offset + addend
567
+ /// only.
568
+ target : ? u32 ,
560
569
atom : * const Atom ,
561
570
offset : u32 ,
562
571
addend : u32 ,
@@ -740,12 +749,7 @@ pub fn initDeclState(self: *Dwarf, mod: *Module, decl: *Module.Decl) !DeclState
740
749
.wasm = > & decl .link .wasm .dbg_info_atom ,
741
750
else = > unreachable ,
742
751
};
743
- try decl_state .addTypeReloc (
744
- atom ,
745
- fn_ret_type ,
746
- @intCast (u32 , dbg_info_buffer .items .len ),
747
- null ,
748
- );
752
+ try decl_state .addTypeRelocGlobal (atom , fn_ret_type , @intCast (u32 , dbg_info_buffer .items .len ));
749
753
dbg_info_buffer .items .len += 4 ; // DW.AT.type, DW.FORM.ref4
750
754
}
751
755
@@ -1036,30 +1040,39 @@ pub fn commitDeclState(
1036
1040
try self .updateDeclDebugInfoAllocation (file , atom , @intCast (u32 , dbg_info_buffer .items .len ));
1037
1041
1038
1042
while (decl_state .abbrev_relocs .popOrNull ()) | reloc | {
1039
- const symbol = decl_state .abbrev_table .items [reloc .target ];
1040
- const ty = symbol .@"type" ;
1041
- const deferred : bool = blk : {
1042
- if (ty .isAnyError ()) break :blk true ;
1043
- switch (ty .tag ()) {
1044
- .error_set_inferred = > {
1045
- if (! ty .castTag (.error_set_inferred ).? .data .is_resolved ) break :blk true ;
1046
- },
1047
- else = > {},
1043
+ if (reloc .target ) | target | {
1044
+ const symbol = decl_state .abbrev_table .items [target ];
1045
+ const ty = symbol .@"type" ;
1046
+ const deferred : bool = blk : {
1047
+ if (ty .isAnyError ()) break :blk true ;
1048
+ switch (ty .tag ()) {
1049
+ .error_set_inferred = > {
1050
+ if (! ty .castTag (.error_set_inferred ).? .data .is_resolved ) break :blk true ;
1051
+ },
1052
+ else = > {},
1053
+ }
1054
+ break :blk false ;
1055
+ };
1056
+ if (deferred ) {
1057
+ try self .global_abbrev_relocs .append (gpa , .{
1058
+ .target = null ,
1059
+ .offset = reloc .offset ,
1060
+ .atom = reloc .atom ,
1061
+ .addend = reloc .addend ,
1062
+ });
1063
+ } else {
1064
+ mem .writeInt (
1065
+ u32 ,
1066
+ dbg_info_buffer .items [reloc .offset .. ][0.. @sizeOf (u32 )],
1067
+ symbol .atom .off + symbol .offset + reloc .addend ,
1068
+ target_endian ,
1069
+ );
1048
1070
}
1049
- break :blk false ;
1050
- };
1051
- if (deferred ) {
1052
- try self .global_abbrev_relocs .append (gpa , .{
1053
- .target = undefined ,
1054
- .offset = reloc .offset ,
1055
- .atom = reloc .atom ,
1056
- .addend = reloc .addend ,
1057
- });
1058
1071
} else {
1059
1072
mem .writeInt (
1060
1073
u32 ,
1061
1074
dbg_info_buffer .items [reloc .offset .. ][0.. @sizeOf (u32 )],
1062
- symbol .atom .off + symbol .offset + reloc .addend ,
1075
+ reloc .atom .off + reloc .offset + reloc .addend ,
1063
1076
target_endian ,
1064
1077
);
1065
1078
}
0 commit comments