Skip to content

Commit 2a76093

Browse files
committed
form value resolution; line table header parsing
1 parent faee02f commit 2a76093

File tree

5 files changed

+98
-28
lines changed

5 files changed

+98
-28
lines changed

src/dwarf/dwarf.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ dw_attrib_class_from_attrib_mips(DW_AttribKind k)
194194
}
195195

196196
internal DW_AttribClass
197-
dw_attrib_class_from_attrib(DW_Version ver, DW_Ext ext, DW_AttribKind k)
197+
dw_attrib_class_from_kind(DW_Version ver, DW_Ext ext, DW_AttribKind k)
198198
{
199199
DW_AttribClass result = DW_AttribClass_Null;
200200

@@ -344,11 +344,11 @@ dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, DW_AttribKind attrib_kind
344344
// This function's purpose is to find the overlapping class between an
345345
// DW_AttribKind and DW_FormKind.
346346

347-
DW_AttribClass attrib_class = dw_attrib_class_from_attrib(ver, ext, attrib_kind);
347+
DW_AttribClass attrib_class = dw_attrib_class_from_kind(ver, ext, attrib_kind);
348348
DW_AttribClass form_class = dw_attrib_class_from_form_kind(ver, form_kind);
349349
if(attrib_class == DW_AttribClass_Null || form_class == DW_AttribClass_Null)
350350
{
351-
attrib_class = dw_attrib_class_from_attrib(DW_Version_Last, ext, attrib_kind);
351+
attrib_class = dw_attrib_class_from_kind(DW_Version_Last, ext, attrib_kind);
352352
form_class = dw_attrib_class_from_form_kind(DW_Version_Last, form_kind);
353353
}
354354

src/dwarf/dwarf.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ X(GNU_RefAlt, DW_AttribClass_Undefined) \
478478
X(GNU_StrpAlt, DW_AttribClass_String)
479479

480480
typedef U64 DW_FormKind;
481-
typedef enum DW_FormEnum
481+
typedef enum DW_FormKindEnum
482482
{
483483
DW_Form_Null,
484484
#define X(_N, _ID) DW_Form_##_N = _ID,
@@ -487,7 +487,7 @@ typedef enum DW_FormEnum
487487
DW_Form_V5_XList(X)
488488
DW_Form_GNU_XList(X)
489489
#undef X
490-
} DW_FormEnum;
490+
} DW_FormKindEnum;
491491

492492
//- Attributes DWARF2
493493

@@ -1762,7 +1762,7 @@ internal DW_AttribClass dw_attrib_class_from_attrib_llvm (DW_AttribKind k);
17621762
internal DW_AttribClass dw_attrib_class_from_attrib_apple(DW_AttribKind k);
17631763
internal DW_AttribClass dw_attrib_class_from_attrib_mips (DW_AttribKind k);
17641764

1765-
internal DW_AttribClass dw_attrib_class_from_attrib(DW_Version ver, DW_Ext ext, DW_AttribKind v);
1765+
internal DW_AttribClass dw_attrib_class_from_kind(DW_Version ver, DW_Ext ext, DW_AttribKind v);
17661766

17671767
//- Form Class Encodings
17681768

src/dwarf/dwarf_parse_2.c

Lines changed: 59 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,9 @@ internal U64
246246
dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out)
247247
{
248248
U64 start_off = off;
249-
DW2_FormVal val = {0};
249+
DW2_FormVal val = {form_kind};
250250
{
251+
//- rjf: read value bytes
251252
U64 bytes_to_read = 0;
252253
switch(form_kind)
253254
{
@@ -351,8 +352,7 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin
351352
U64 size = 0;
352353
U64 og_read_off = off;
353354
off += str8_deserial_read_uleb128(data, off, &size);
354-
val.u128.u64[0] = size;
355-
val.u128.u64[1] = og_read_off;
355+
val.string = str8_substr(data, r1u64(off, off+size));
356356
off += size;
357357
}break;
358358

@@ -362,8 +362,7 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin
362362
String8 string = {0};
363363
U64 og_read_off = off;
364364
off += str8_deserial_read_cstr(data, off, &string);
365-
val.u128.u64[0] = og_read_off;
366-
val.u128.u64[1] = og_read_off + string.size - 1;
365+
val.string = string;
367366
}break;
368367

369368
//- rjf: implicit constants (no reading in .debug_info; value comes from .debug_abbrev)
@@ -389,21 +388,41 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin
389388
val.u128.u64[0] = 1;
390389
}break;
391390
}
391+
392+
//- rjf: in some cases, resolve numeric values -> strings
393+
{
394+
switch(form_kind)
395+
{
396+
default:{}break;
397+
case DW_Form_Strx1:
398+
case DW_Form_Strx2:
399+
case DW_Form_Strx3:
400+
case DW_Form_Strx4:
401+
case DW_Form_Strx:
402+
{
403+
// TODO(rjf)
404+
}break;
405+
case DW_Form_LineStrp:
406+
{
407+
String8 string_section_data = ctx->raw->sec[DW_Section_LineStr].data;
408+
val.string = str8_cstring_capped(string_section_data.str + val.u128.u64[0],
409+
string_section_data.str + string_section_data.size);
410+
}break;
411+
case DW_Form_Strp:
412+
case DW_Form_StrpSup:
413+
{
414+
String8 string_section_data = ctx->raw->sec[DW_Section_Str].data;
415+
val.string = str8_cstring_capped(string_section_data.str + val.u128.u64[0],
416+
string_section_data.str + string_section_data.size);
417+
}break;
418+
}
419+
}
392420
}
393421
*out = val;
394422
U64 bytes_read = (off - start_off);
395423
return bytes_read;
396424
}
397425

398-
internal String8
399-
dw2_string_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal val)
400-
{
401-
String8 section_data = ctx->raw->sec[val.section_kind].data;
402-
Rng1U64 range = r1u64(val.u128.u64[0], val.u128.u64[1]);
403-
String8 string = str8_substr(section_data, range);
404-
return string;
405-
}
406-
407426
////////////////////////////////
408427
//~ rjf: Tag Parsing
409428

@@ -490,7 +509,7 @@ dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *ta
490509
SLLQueuePush(attribs.first, attribs.last, n);
491510
attribs.count += 1;
492511
n->v.attrib_kind = attrib_kind;
493-
n->v.form_kind = attrib_form_kind;
512+
n->v.val = val;
494513
}
495514

496515
// rjf: no movement, or no attrib kind -> done
@@ -511,6 +530,21 @@ dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *ta
511530
return bytes_read;
512531
}
513532

533+
internal DW2_Attrib *
534+
dw2_attrib_from_kind(DW2_Tag *tag, DW_AttribKind kind)
535+
{
536+
DW2_Attrib *result = &dw2_attrib_nil;
537+
for EachNode(n, DW2_AttribNode, tag->attribs.first)
538+
{
539+
if(n->v.attrib_kind == kind)
540+
{
541+
result = &n->v;
542+
break;
543+
}
544+
}
545+
return result;
546+
}
547+
514548
////////////////////////////////
515549
//~ rjf: Line Table Parsing
516550

@@ -695,15 +729,16 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of
695729
case DW_Version_5:
696730
{
697731
//- rjf: read directory & file tables
698-
for(B32 files = 0, dirs = 1; files <= 1; files = 1, dirs = 0)
732+
for(B32 do_files = 0, do_dirs = 1; do_files <= 1; do_files += 1, do_dirs = 0)
699733
{
700734
// rjf: read header
701735
U8 entry_formats_count = 0;
702736
off += str8_deserial_read_struct(data, off, &entry_formats_count);
703737
U64 *entry_formats = push_array(scratch.arena, U64, entry_formats_count*2);
704738
for EachIndex(idx, entry_formats_count)
705739
{
706-
off += str8_deserial_read_uleb128(data, off, &entry_formats[idx]);
740+
off += str8_deserial_read_uleb128(data, off, &entry_formats[idx*2 + 0]);
741+
off += str8_deserial_read_uleb128(data, off, &entry_formats[idx*2 + 1]);
707742
}
708743
U64 table_count = 0;
709744
off += str8_deserial_read_uleb128(data, off, &table_count);
@@ -731,7 +766,7 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of
731766
}break;
732767
case DW_LNCT_Path:
733768
{
734-
entry_out->file_name = dw2_string_from_form_val(ctx, form_val);
769+
entry_out->file_name = form_val.string;
735770
}break;
736771
case DW_LNCT_DirectoryIndex:
737772
{
@@ -751,12 +786,17 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of
751786
}break;
752787
case DW_LNCT_LLVM_Source:
753788
{
754-
entry_out->source = dw2_string_from_form_val(ctx, form_val);
789+
entry_out->source = form_val.string;
755790
}break;
756791
}
757792
}
758793
}
759794
}
795+
796+
// rjf: store
797+
if(0){}
798+
else if(do_files) { files = table; }
799+
else if(do_dirs) { dirs = table; }
760800
}
761801

762802
}break;

src/dwarf/dwarf_parse_2.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,15 @@ struct DW2_ParseCtx
5959
typedef struct DW2_FormVal DW2_FormVal;
6060
struct DW2_FormVal
6161
{
62-
DW_SectionKind section_kind;
62+
DW_FormKind kind;
63+
String8 string;
6364
U128 u128;
6465
};
6566

6667
typedef struct DW2_Attrib DW2_Attrib;
6768
struct DW2_Attrib
6869
{
6970
DW_AttribKind attrib_kind;
70-
DW_FormKind form_kind;
7171
DW2_FormVal val;
7272
};
7373

@@ -154,6 +154,11 @@ struct DW2_LineTableHeader
154154
DW2_LineTableFileArray files;
155155
};
156156

157+
////////////////////////////////
158+
//~ rjf: Globals
159+
160+
global read_only DW2_Attrib dw2_attrib_nil = {0};
161+
157162
////////////////////////////////
158163
//~ rjf: Basic Parsing Helpers
159164

@@ -174,12 +179,12 @@ internal DW2_AbbrevMap dw2_abbrev_map_from_data(Arena *arena, String8 data, U64
174179
//~ rjf: Form Value Parsing
175180

176181
internal U64 dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out);
177-
internal String8 dw2_string_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal val);
178182

179183
////////////////////////////////
180184
//~ rjf: Tag Parsing
181185

182186
internal U64 dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out);
187+
internal DW2_Attrib *dw2_attrib_from_kind(DW2_Tag *tag, DW_AttribKind kind);
183188

184189
////////////////////////////////
185190
//~ rjf: Line Table Parsing

src/rdi_from_dwarf/rdi_from_dwarf_2.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,31 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params)
298298
}
299299
lane_sync();
300300

301+
////////////////////////////
302+
//- rjf: parse each unit's line table
303+
//
304+
{
305+
U64 unit_take_idx = 0;
306+
U64 *unit_take_idx_ptr = &unit_take_idx;
307+
lane_sync_u64(&unit_take_idx_ptr, 0);
308+
for(;;)
309+
{
310+
U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1;
311+
if(unit_idx >= unit_count)
312+
{
313+
break;
314+
}
315+
DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx];
316+
DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx];
317+
DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList);
318+
U64 line_info_off = stmt_list->val.u128.u64[0];
319+
DW2_LineTableHeader line_table_header = {0};
320+
String8 line_info_data = raw->sec[DW_Section_Line].data;
321+
dw2_read_line_table_header(scratch.arena, ctx, line_info_data, line_info_off, &line_table_header);
322+
}
323+
}
324+
lane_sync();
325+
301326
////////////////////////////
302327
//- rjf: fill result
303328
//

0 commit comments

Comments
 (0)