next checkpoint on dwarf cleanup

This commit is contained in:
Ryan Fleury
2025-11-10 16:37:23 -08:00
parent f396b2eaa3
commit 08642d2745
9 changed files with 387 additions and 403 deletions
+20 -20
View File
@@ -611,19 +611,19 @@ typedef enum Arch
Arch_arm64, Arch_arm64,
Arch_arm32, Arch_arm32,
Arch_COUNT, Arch_COUNT,
#if ARCH_X64
Arch_CURRENT = Arch_x64,
#elif ARCH_X86
Arch_CURRENT = Arch_x86,
#elif ARCH_ARM64
Arch_CURRENT = Arch_arm64,
#elif ARCH_ARM32
Arch_CURRENT = Arch_arm32,
#else
Arch_CURRENT = Arch_Null,
#endif
} }
Arch; Arch;
#if ARCH_X64
# define Arch_CURRENT Arch_x64
#elif ARCH_X86
# define Arch_CURRENT Arch_x86
#elif ARCH_ARM64
# define Arch_CURRENT Arch_arm64
#elif ARCH_ARM32
# define Arch_CURRENT Arch_arm32
#else
# define Arch_CURRENT Arch_Null
#endif
typedef enum Compiler typedef enum Compiler
{ {
@@ -632,17 +632,17 @@ typedef enum Compiler
Compiler_gcc, Compiler_gcc,
Compiler_clang, Compiler_clang,
Compiler_COUNT, Compiler_COUNT,
#if COMPILER_MSVC
Compiler_CURRENT = Compiler_msvc,
#elif COMPILER_GCC
Compiler_CURRENT = Compiler_gcc,
#elif COMPILER_CLANG
Compiler_CURRENT = Compiler_clang,
#else
Compiler_CURRENT = Compiler_Null,
#endif
} }
Compiler; Compiler;
#if COMPILER_MSVC
# define Compiler_CURRENT Compiler_msvc
#elif COMPILER_GCC
# define Compiler_CURRENT Compiler_gcc
#elif COMPILER_CLANG
# define Compiler_CURRENT Compiler_clang
#else
# define Compiler_CURRENT Compiler_Null
#endif
//////////////////////////////// ////////////////////////////////
//~ rjf: Text 2D Coordinates & Ranges //~ rjf: Text 2D Coordinates & Ranges
+72 -70
View File
@@ -73,10 +73,10 @@ internal U64
dw_reg_count_from_arch(Arch arch) dw_reg_count_from_arch(Arch arch)
{ {
switch (arch) { switch (arch) {
default: { NotImplemented; } // fall-through default: { NotImplemented; } // fall-through
case Arch_Null: return 0; case Arch_Null: return 0;
case Arch_x86: return DW_RegX86_Last; case Arch_x86: return DW_RegX86_Last;
case Arch_x64: return DW_RegX64_Last; case Arch_x64: return DW_RegX64_Last;
} }
} }
@@ -98,10 +98,10 @@ internal U64
dw_sp_from_arch(Arch arch) dw_sp_from_arch(Arch arch)
{ {
switch (arch) { switch (arch) {
default: NotImplemented; default: NotImplemented;
case Arch_Null: return 0; case Arch_Null: return 0;
case Arch_x86: return DW_RegX86_Esp; case Arch_x86: return DW_RegX86_Esp;
case Arch_x64: return DW_RegX64_Rsp; case Arch_x64: return DW_RegX64_Rsp;
} }
} }
@@ -278,58 +278,64 @@ internal B32
dw_are_attrib_class_and_form_kind_compatible(DW_Version ver, DW_AttribClass attrib_class, DW_FormKind form_kind) dw_are_attrib_class_and_form_kind_compatible(DW_Version ver, DW_AttribClass attrib_class, DW_FormKind form_kind)
{ {
DW_AttribClass compat_flags = dw_attrib_class_from_form_kind(ver, form_kind); DW_AttribClass compat_flags = dw_attrib_class_from_form_kind(ver, form_kind);
B32 are_compat = (attrib_class & compat_flags) != 0; B32 are_compat = (attrib_class & compat_flags) != 0;
return are_compat; return are_compat;
} }
internal String8 internal String8
dw_name_string_from_section_kind(DW_SectionKind k) dw_name_string_from_section_kind(DW_SectionKind k)
{ {
switch (k) { String8 result = {0};
#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_L); switch(k)
{
#define X(_N,_L,_M,_D) case DW_Section_##_N:{result = str8_lit(_L);}break;
DW_SectionKind_XList(X) DW_SectionKind_XList(X)
#undef X #undef X
} }
return str8_zero(); return result;
} }
internal String8 internal String8
dw_mach_name_string_from_section_kind(DW_SectionKind k) dw_mach_name_string_from_section_kind(DW_SectionKind k)
{ {
switch (k) { String8 result = {0};
#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_M); switch(k)
{
#define X(_N,_L,_M,_D) case DW_Section_##_N:{result = str8_lit(_M);}break;
DW_SectionKind_XList(X) DW_SectionKind_XList(X)
#undef X #undef X
} }
return str8_zero(); return result;
} }
internal String8 internal String8
dw_dwo_name_string_from_section_kind(DW_SectionKind k) dw_dwo_name_string_from_section_kind(DW_SectionKind k)
{ {
switch (k) { String8 result = {0};
#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_D); switch(k)
{
#define X(_N,_L,_M,_D) case DW_Section_##_N:{result = str8_lit(_D);}break;
DW_SectionKind_XList(X) DW_SectionKind_XList(X)
#undef X #undef X
} }
return str8_zero(); return result;
} }
internal U64 internal U64
dw_size_from_format(DW_Format format) dw_size_from_format(DW_Format format)
{ {
U64 result = 0; U64 result = 0;
switch (format) { switch(format)
case DW_Format_Null: break; {
default:{}break;
case DW_Format_32Bit: result = 4; break; case DW_Format_32Bit: result = 4; break;
case DW_Format_64Bit: result = 8; break; case DW_Format_64Bit: result = 8; break;
default: InvalidPath; break;
} }
return result; return result;
} }
internal DW_AttribClass internal DW_AttribClass
dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, B32 relaxed, DW_AttribKind attrib_kind, DW_FormKind form_kind) dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, DW_AttribKind attrib_kind, DW_FormKind form_kind)
{ {
// NOTE(rjf): DWARF's spec specifies two mappings: // NOTE(rjf): DWARF's spec specifies two mappings:
// (DW_AttribKind) => List(DW_AttribClass) // (DW_AttribKind) => List(DW_AttribClass)
@@ -340,14 +346,10 @@ dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, B32 relaxed, DW_AttribKin
DW_AttribClass attrib_class = dw_attrib_class_from_attrib(ver, ext, attrib_kind); DW_AttribClass attrib_class = dw_attrib_class_from_attrib(ver, ext, attrib_kind);
DW_AttribClass form_class = dw_attrib_class_from_form_kind(ver, form_kind); DW_AttribClass form_class = dw_attrib_class_from_form_kind(ver, form_kind);
if(attrib_class == DW_AttribClass_Null || form_class == DW_AttribClass_Null)
if(relaxed)
{ {
if(attrib_class == DW_AttribClass_Null || form_class == DW_AttribClass_Null) attrib_class = dw_attrib_class_from_attrib(DW_Version_Last, ext, attrib_kind);
{ form_class = dw_attrib_class_from_form_kind(DW_Version_Last, form_kind);
attrib_class = dw_attrib_class_from_attrib(DW_Version_Last, ext, attrib_kind);
form_class = dw_attrib_class_from_form_kind(DW_Version_Last, form_kind);
}
} }
DW_AttribClass result = DW_AttribClass_Null; DW_AttribClass result = DW_AttribClass_Null;
@@ -428,11 +430,11 @@ dw_operand_count_from_expr_op(DW_ExprOp op)
switch (op) { switch (op) {
#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _OPER_COUNT; #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _OPER_COUNT;
DW_Expr_V3_XList(X) DW_Expr_V3_XList(X)
DW_Expr_V4_XList(X) DW_Expr_V4_XList(X)
DW_Expr_V5_XList(X) DW_Expr_V5_XList(X)
DW_Expr_GNU_XList(X) DW_Expr_GNU_XList(X)
#undef X #undef X
default: { NotImplemented; } break; default: { NotImplemented; } break;
} }
return 0; return 0;
} }
@@ -443,11 +445,11 @@ dw_pop_count_from_expr_op(DW_ExprOp op)
switch (op) { switch (op) {
#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _POP_COUNT; #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _POP_COUNT;
DW_Expr_V3_XList(X) DW_Expr_V3_XList(X)
DW_Expr_V4_XList(X) DW_Expr_V4_XList(X)
DW_Expr_V5_XList(X) DW_Expr_V5_XList(X)
DW_Expr_GNU_XList(X) DW_Expr_GNU_XList(X)
#undef X #undef X
default: { NotImplemented; } break; default: { NotImplemented; } break;
} }
return 0; return 0;
} }
@@ -458,11 +460,11 @@ dw_push_count_from_expr_op(DW_ExprOp op)
switch (op) { switch (op) {
#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _PUSH_COUNT; #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _PUSH_COUNT;
DW_Expr_V3_XList(X) DW_Expr_V3_XList(X)
DW_Expr_V4_XList(X) DW_Expr_V4_XList(X)
DW_Expr_V5_XList(X) DW_Expr_V5_XList(X)
DW_Expr_GNU_XList(X) DW_Expr_GNU_XList(X)
#undef X #undef X
default: { NotImplemented; } break; default: { NotImplemented; } break;
} }
return 0; return 0;
} }
@@ -474,7 +476,7 @@ dw_operand_count_from_cfa_opcode(DW_CFA_Opcode opcode)
#define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return ArrayCount(t)-1; } #define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return ArrayCount(t)-1; }
DW_CFA_Kind_XList(X) DW_CFA_Kind_XList(X)
#undef X #undef X
default: { NotImplemented; } break; default: { NotImplemented; } break;
} }
return 0; return 0;
} }
@@ -484,21 +486,21 @@ dw_is_cfa_expr_opcode_invalid(DW_ExprOp opcode)
{ {
B32 is_invalid = 0; B32 is_invalid = 0;
switch (opcode) { switch (opcode) {
case DW_ExprOp_Addrx: case DW_ExprOp_Addrx:
case DW_ExprOp_Call2: case DW_ExprOp_Call2:
case DW_ExprOp_Call4: case DW_ExprOp_Call4:
case DW_ExprOp_CallRef: case DW_ExprOp_CallRef:
case DW_ExprOp_ConstType: case DW_ExprOp_ConstType:
case DW_ExprOp_Constx: case DW_ExprOp_Constx:
case DW_ExprOp_Convert: case DW_ExprOp_Convert:
case DW_ExprOp_DerefType: case DW_ExprOp_DerefType:
case DW_ExprOp_RegvalType: case DW_ExprOp_RegvalType:
case DW_ExprOp_Reinterpret: case DW_ExprOp_Reinterpret:
case DW_ExprOp_PushObjectAddress: case DW_ExprOp_PushObjectAddress:
case DW_ExprOp_CallFrameCfa: { case DW_ExprOp_CallFrameCfa: {
is_invalid = 1; is_invalid = 1;
} break; } break;
default: break; default: break;
} }
return is_invalid; return is_invalid;
} }
@@ -508,14 +510,14 @@ dw_is_new_row_cfa_opcode(DW_CFA_Opcode opcode)
{ {
B32 is_new_row_op = 0; B32 is_new_row_op = 0;
switch (opcode) { switch (opcode) {
case DW_CFA_SetLoc: case DW_CFA_SetLoc:
case DW_CFA_AdvanceLoc: case DW_CFA_AdvanceLoc:
case DW_CFA_AdvanceLoc1: case DW_CFA_AdvanceLoc1:
case DW_CFA_AdvanceLoc2: case DW_CFA_AdvanceLoc2:
case DW_CFA_AdvanceLoc4: { case DW_CFA_AdvanceLoc4: {
is_new_row_op = 1; is_new_row_op = 1;
} break; } break;
default: break; default: break;
} }
return is_new_row_op; return is_new_row_op;
} }
@@ -527,7 +529,7 @@ dw_operand_types_from_cfa_op(DW_CFA_Opcode opcode)
#define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return &t[0] + 1; } #define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return &t[0] + 1; }
DW_CFA_Kind_XList(X) DW_CFA_Kind_XList(X)
#undef X #undef X
default: { NotImplemented; } break; default: { NotImplemented; } break;
} }
return 0; return 0;
} }
@@ -539,9 +541,9 @@ internal String8
dw_string_from_format(DW_Format format) dw_string_from_format(DW_Format format)
{ {
switch (format) { switch (format) {
case DW_Format_Null: return str8_zero(); case DW_Format_Null: return str8_zero();
case DW_Format_32Bit: return str8_lit("DWARF32"); case DW_Format_32Bit: return str8_lit("DWARF32");
case DW_Format_64Bit: return str8_lit("DWARF64"); case DW_Format_64Bit: return str8_lit("DWARF64");
} }
return str8_zero(); return str8_zero();
} }
@@ -824,7 +826,7 @@ dw_string_from_cfa_opcode(DW_CFA_Opcode opcode)
#define X(_NAME, _ID, ...) case _ID: return str8_lit(Stringify(_NAME)); #define X(_NAME, _ID, ...) case _ID: return str8_lit(Stringify(_NAME));
DW_CFA_Kind_XList(X) DW_CFA_Kind_XList(X)
#undef X #undef X
default: InvalidPath; break; default: InvalidPath; break;
} }
return str8_zero(); return str8_zero();
} }
+1 -1
View File
@@ -1782,7 +1782,7 @@ internal U64 dw_size_from_format(DW_Format format);
//////////////////////////////// ////////////////////////////////
internal DW_AttribClass dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, B32 relaxed, DW_AttribKind attrib, DW_FormKind form_kind); internal DW_AttribClass dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, DW_AttribKind attrib, DW_FormKind form_kind);
internal U64 dw_pick_default_lower_bound(DW_Language lang); internal U64 dw_pick_default_lower_bound(DW_Language lang);
+4 -20
View File
@@ -1,13 +1,6 @@
// Copyright (c) Epic Games Tools // Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
internal U64
dw_hash_from_string(String8 string)
{
XXH64_hash_t hash64 = XXH3_64bits(string.str, string.size);
return hash64;
}
internal U64 internal U64
str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out) str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out)
{ {
@@ -58,20 +51,16 @@ str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out)
U64 cursor = off; U64 cursor = off;
for(;;) for(;;)
{ {
U8 byte = 0; U8 byte = 0;
U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte);
if(bytes_read != sizeof(byte)) if(bytes_read != sizeof(byte))
{ {
break; break;
} }
U8 val = byte & 0x7fu; U8 val = byte & 0x7fu;
value |= ((U64)val) << shift; value |= ((U64)val) << shift;
cursor += bytes_read; cursor += bytes_read;
shift += 7u; shift += 7u;
if((byte & 0x80u) == 0) if((byte & 0x80u) == 0)
{ {
break; break;
@@ -93,19 +82,16 @@ str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out)
U64 cursor = off; U64 cursor = off;
for(;;) for(;;)
{ {
U8 byte; U8 byte = 0;
U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte);
if(bytes_read != sizeof(byte)) if(bytes_read != sizeof(byte))
{ {
break; break;
} }
U8 val = byte & 0x7fu; U8 val = byte & 0x7fu;
value |= ((U64)val) << shift; value |= ((U64)val) << shift;
cursor += bytes_read; cursor += bytes_read;
shift += 7u; shift += 7u;
if((byte & 0x80u) == 0) if((byte & 0x80u) == 0)
{ {
if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0) if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0)
@@ -1678,7 +1664,7 @@ dw_interp_loclists_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form)
internal DW_AttribClass internal DW_AttribClass
dw_value_class_from_attrib(DW_CompUnit *cu, DW_Attrib *attrib) dw_value_class_from_attrib(DW_CompUnit *cu, DW_Attrib *attrib)
{ {
return dw_pick_attrib_value_class(cu->version, cu->ext, cu->relaxed, attrib->attrib_kind, attrib->form_kind); return dw_pick_attrib_value_class(cu->version, cu->ext, attrib->attrib_kind, attrib->form_kind);
} }
internal String8 internal String8
@@ -2163,7 +2149,6 @@ dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U6
U64 low_pc = dw_interp_address(address_size, max_U64, addr_lu, low_pc_attrib->form_kind, low_pc_attrib->form); U64 low_pc = dw_interp_address(address_size, max_U64, addr_lu, low_pc_attrib->form_kind, low_pc_attrib->form);
// fill out compile unit // fill out compile unit
cu.relaxed = relaxed;
cu.ext = DW_Ext_All; cu.ext = DW_Ext_All;
cu.kind = unit_kind; cu.kind = unit_kind;
cu.version = version; cu.version = version;
@@ -3027,7 +3012,6 @@ dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Input *input,
// //
// See the DWARF V4 spec (June 10, 2010), page 122. // See the DWARF V4 spec (June 10, 2010), page 122.
error = 1; error = 1;
// AssertAlways(!"UNHANDLED DEFINE FILE!!!");
}break; }break;
case DW_ExtOpcode_SetDiscriminator: case DW_ExtOpcode_SetDiscriminator:
@@ -3103,7 +3087,7 @@ dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_Sect
String8 string = {0}; String8 string = {0};
cursor += str8_deserial_read_cstr(section_data, cursor, &string); cursor += str8_deserial_read_cstr(section_data, cursor, &string);
U64 hash = dw_hash_from_string(string); U64 hash = u64_hash_from_str8(string);
U64 bucket_idx = hash % names_table.size; U64 bucket_idx = hash % names_table.size;
DW_PubStringsBucket *bucket = push_array(arena, DW_PubStringsBucket, 1); DW_PubStringsBucket *bucket = push_array(arena, DW_PubStringsBucket, 1);
+94 -82
View File
@@ -4,54 +4,59 @@
#ifndef DWARF_PARSE_H #ifndef DWARF_PARSE_H
#define DWARF_PARSE_H #define DWARF_PARSE_H
typedef struct DW_Section typedef struct DW_Section DW_Section;
struct DW_Section
{ {
String8 name; String8 name;
String8 data; String8 data;
B32 is_dwo; B32 is_dwo;
} DW_Section; };
typedef struct DW_Input typedef struct DW_Input DW_Input;
struct DW_Input
{ {
DW_Section sec[DW_Section_Count]; DW_Section sec[DW_Section_Count];
DW_Section sup[DW_Section_Count]; DW_Section sup[DW_Section_Count];
} DW_Input; };
typedef struct DW_ListUnit typedef struct DW_ListUnit DW_ListUnit;
struct DW_ListUnit
{ {
DW_Version version; DW_Version version;
U64 address_size; U64 address_size;
U64 segment_selector_size; U64 segment_selector_size;
U64 entry_size; U64 entry_size;
String8 entries; String8 entries;
} DW_ListUnit; };
typedef struct DW_ListUnitInput typedef struct DW_ListUnitInput DW_ListUnitInput;
struct DW_ListUnitInput
{ {
U64 addr_count; U64 addr_count;
U64 str_offset_count; U64 str_offset_count;
U64 rnglist_count; U64 rnglist_count;
U64 loclist_count; U64 loclist_count;
Rng1U64Array addr_ranges; Rng1U64Array addr_ranges;
Rng1U64Array str_offset_ranges; Rng1U64Array str_offset_ranges;
Rng1U64Array rnglist_ranges; Rng1U64Array rnglist_ranges;
Rng1U64Array loclist_ranges; Rng1U64Array loclist_ranges;
DW_ListUnit *addrs; DW_ListUnit *addrs;
DW_ListUnit *str_offsets; DW_ListUnit *str_offsets;
DW_ListUnit *rnglists; DW_ListUnit *rnglists;
DW_ListUnit *loclists; DW_ListUnit *loclists;
} DW_ListUnitInput; };
typedef struct DW_AbbrevTableEntry typedef struct DW_AbbrevTableEntry DW_AbbrevTableEntry;
struct DW_AbbrevTableEntry
{ {
U64 id; U64 id;
U64 off; U64 off;
} DW_AbbrevTableEntry; };
typedef struct DW_AbbrevTable DW_AbbrevTable; typedef struct DW_AbbrevTable DW_AbbrevTable;
struct DW_AbbrevTable struct DW_AbbrevTable
{ {
U64 count; U64 count;
DW_AbbrevTableEntry *entries; DW_AbbrevTableEntry *entries;
}; };
@@ -63,7 +68,8 @@ typedef enum DW_AbbrevKind
DW_Abbrev_AttribSequenceEnd, DW_Abbrev_AttribSequenceEnd,
DW_Abbrev_DIEBegin, DW_Abbrev_DIEBegin,
DW_Abbrev_DIEEnd, DW_Abbrev_DIEEnd,
} DW_AbbrevKind; }
DW_AbbrevKind;
typedef U32 DW_AbbrevFlags; typedef U32 DW_AbbrevFlags;
enum enum
@@ -72,14 +78,15 @@ enum
DW_AbbrevFlag_HasChildren = (1 << 1), DW_AbbrevFlag_HasChildren = (1 << 1),
}; };
typedef struct DW_Abbrev typedef struct DW_Abbrev DW_Abbrev;
struct DW_Abbrev
{ {
DW_AbbrevKind kind; DW_AbbrevKind kind;
U64 sub_kind; U64 sub_kind;
U64 id; U64 id;
U64 const_value; U64 const_value;
DW_AbbrevFlags flags; DW_AbbrevFlags flags;
} DW_Abbrev; };
typedef union DW_Form typedef union DW_Form
{ {
@@ -100,71 +107,80 @@ typedef union DW_Form
U64 rnglistx; U64 rnglistx;
U64 ptr; U64 ptr;
U64 implicit_const; U64 implicit_const;
} DW_Form; }
DW_Form;
typedef struct DW_Attrib typedef struct DW_Attrib DW_Attrib;
struct DW_Attrib
{ {
U64 info_off; U64 info_off;
U64 abbrev_off; U64 abbrev_off;
U64 abbrev_id; U64 abbrev_id;
DW_AttribKind attrib_kind; DW_AttribKind attrib_kind;
DW_FormKind form_kind; DW_FormKind form_kind;
DW_Form form; DW_Form form;
} DW_Attrib; };
typedef struct DW_AttribNode typedef struct DW_AttribNode DW_AttribNode;
struct DW_AttribNode
{ {
struct DW_AttribNode *next; DW_AttribNode *next;
DW_Attrib v; DW_Attrib v;
} DW_AttribNode; };
typedef struct DW_AttribList typedef struct DW_AttribList DW_AttribList;
struct DW_AttribList
{ {
DW_AttribNode *first; DW_AttribNode *first;
DW_AttribNode *last; DW_AttribNode *last;
U64 count; U64 count;
} DW_AttribList; };
typedef struct DW_Tag typedef struct DW_Tag DW_Tag;
struct DW_Tag
{ {
B32 has_children; B32 has_children;
U64 abbrev_id; U64 abbrev_id;
DW_TagKind kind; DW_TagKind kind;
DW_AttribList attribs; DW_AttribList attribs;
U64 info_off; U64 info_off;
U8 v[1]; U8 v[1];
} DW_Tag; };
typedef struct DW_TagNode typedef struct DW_TagNode DW_TagNode;
struct DW_TagNode
{ {
DW_Tag tag; DW_Tag tag;
struct DW_TagNode *sibling; DW_TagNode *sibling;
struct DW_TagNode *first_child; DW_TagNode *first_child;
struct DW_TagNode *last_child; DW_TagNode *last_child;
} DW_TagNode; };
typedef struct DW_Loc typedef struct DW_Loc DW_Loc;
struct DW_Loc
{ {
Rng1U64 range; Rng1U64 range;
String8 expr; String8 expr;
} DW_Loc; };
typedef struct DW_LocNode typedef struct DW_LocNode DW_LocNode;
struct DW_LocNode
{ {
DW_Loc v; DW_LocNode *next;
struct DW_LocNode *next; DW_Loc v;
} DW_LocNode; };
typedef struct DW_LocList typedef struct DW_LocList DW_LocList;
struct DW_LocList
{ {
U64 count;
DW_LocNode *first; DW_LocNode *first;
DW_LocNode *last; DW_LocNode *last;
} DW_LocList; U64 count;
};
typedef struct DW_CompUnit typedef struct DW_CompUnit DW_CompUnit;
struct DW_CompUnit
{ {
B32 relaxed;
DW_Ext ext; DW_Ext ext;
DW_CompUnitKind kind; DW_CompUnitKind kind;
DW_Version version; DW_Version version;
@@ -183,7 +199,7 @@ typedef struct DW_CompUnit
U64 dwo_id; U64 dwo_id;
DW_Tag tag; DW_Tag tag;
HashTable *tag_ht; HashTable *tag_ht;
} DW_CompUnit; };
typedef struct DW_TagTree typedef struct DW_TagTree
{ {
@@ -328,12 +344,12 @@ typedef union DW_ExprOperand
U16 u16; U16 u16;
U32 u32; U32 u32;
U64 u64; U64 u64;
S8 s8; S8 s8;
S16 s16; S16 s16;
S32 s32; S32 s32;
S64 s64; S64 s64;
String8 block; String8 block;
} DW_ExprOperand; } DW_ExprOperand;
@@ -431,10 +447,6 @@ typedef struct DW_CFA_InstList
#define DW_DECODE_PTR(name) U64 name(String8 data, void *ud, U64 *ptr_out) #define DW_DECODE_PTR(name) U64 name(String8 data, void *ud, U64 *ptr_out)
typedef DW_DECODE_PTR(DW_DecodePtr); typedef DW_DECODE_PTR(DW_DecodePtr);
// hasher
internal U64 dw_hash_from_string(String8 string);
// deserial helpers // deserial helpers
internal U64 str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out); internal U64 str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out);
+170 -159
View File
@@ -1596,25 +1596,26 @@ d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D
//////////////////////////////// ////////////////////////////////
//~ Tag Iterator //~ Tag Iterator
internal D2R_TagIterator * internal D2R_TagIter *
d2r_tag_iterator_init(Arena *arena, DW_TagNode *root) d2r_tag_iter_init(Arena *arena, DW_TagNode *root)
{ {
D2R_TagIterator *iter = push_array(arena, D2R_TagIterator, 1); D2R_TagIter *iter = push_array(arena, D2R_TagIter, 1);
iter->free_list = 0; iter->free_list = 0;
iter->stack = push_array(arena, D2R_TagFrame, 1); iter->stack = push_array(arena, D2R_TagFrame, 1);
iter->stack->node = push_array(arena, DW_TagNode, 1); iter->stack->node = push_array(arena, DW_TagNode, 1);
if(root != 0) if(root != 0)
{ {
*iter->stack->node = *root; *iter->stack->node = *root;
} }
iter->stack->node->sibling = 0; iter->stack->node->sibling = 0;
iter->visit_children = 1; iter->visit_children = 1;
iter->tag_node = root; iter->tag_node = root;
iter->root = root;
return iter; return iter;
} }
internal void internal void
d2r_tag_iterator_next(Arena *arena, D2R_TagIterator *iter) d2r_tag_iter_next(Arena *arena, D2R_TagIter *iter)
{ {
// descend to first child // descend to first child
if (iter->visit_children) { if (iter->visit_children) {
@@ -1643,24 +1644,30 @@ d2r_tag_iterator_next(Arena *arena, D2R_TagIterator *iter)
// update iterator // update iterator
iter->visit_children = 1; iter->visit_children = 1;
iter->tag_node = iter->stack ? iter->stack->node : 0; iter->tag_node = iter->stack ? iter->stack->node : 0;
// rjf: exit on root
if(iter->tag_node == iter->root)
{
iter->tag_node = 0;
}
} }
internal void internal void
d2r_tag_iterator_skip_children(D2R_TagIterator *iter) d2r_tag_iter_skip_children(D2R_TagIter *iter)
{ {
iter->visit_children = 0; iter->visit_children = 0;
} }
internal DW_TagNode * internal DW_TagNode *
d2r_tag_iterator_parent_tag_node(D2R_TagIterator *iter) d2r_tag_iter_parent_tag_node(D2R_TagIter *iter)
{ {
return iter->stack->next->node; return iter->stack->next->node;
} }
internal DW_Tag internal DW_Tag
d2r_tag_iterator_parent_tag(D2R_TagIterator *iter) d2r_tag_iter_parent_tag(D2R_TagIter *iter)
{ {
DW_TagNode *tag_node = d2r_tag_iterator_parent_tag_node(iter); DW_TagNode *tag_node = d2r_tag_iter_parent_tag_node(iter);
return tag_node->tag; return tag_node->tag;
} }
@@ -1723,18 +1730,12 @@ d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *inpu
} }
internal void internal void
d2r_convert_types(Arena *arena, d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root)
D2R_TypeTable *type_table,
DW_Input *input,
DW_CompUnit *cu,
DW_Language cu_lang,
U64 arch_addr_size,
DW_TagNode *root)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
for(D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root);
it->tag_node != 0; it->tag_node != 0;
d2r_tag_iterator_next(scratch.arena, it)) d2r_tag_iter_next(scratch.arena, it))
{ {
DW_TagNode *tag_node = it->tag_node; DW_TagNode *tag_node = it->tag_node;
DW_Tag tag = tag_node->tag; DW_Tag tag = tag_node->tag;
@@ -1742,7 +1743,7 @@ d2r_convert_types(Arena *arena,
// skip converted tags // skip converted tags
if(d2r_is_tag_converted(tag_node)) if(d2r_is_tag_converted(tag_node))
{ {
d2r_tag_iterator_skip_children(it); d2r_tag_iter_skip_children(it);
continue; continue;
} }
@@ -1759,7 +1760,7 @@ d2r_convert_types(Arena *arena,
RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off);
type->kind = RDI_TypeKind_IncompleteClass; type->kind = RDI_TypeKind_IncompleteClass;
type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);
d2r_tag_iterator_skip_children(it); d2r_tag_iter_skip_children(it);
} }
else else
{ {
@@ -1780,7 +1781,7 @@ d2r_convert_types(Arena *arena,
RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off);
type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);
type->kind = RDI_TypeKind_IncompleteStruct; type->kind = RDI_TypeKind_IncompleteStruct;
d2r_tag_iterator_skip_children(it); d2r_tag_iter_skip_children(it);
} }
else else
{ {
@@ -1799,7 +1800,7 @@ d2r_convert_types(Arena *arena,
RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off);
type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);
type->kind = RDI_TypeKind_IncompleteUnion; type->kind = RDI_TypeKind_IncompleteUnion;
d2r_tag_iterator_skip_children(it); d2r_tag_iter_skip_children(it);
} }
else else
{ {
@@ -1818,7 +1819,7 @@ d2r_convert_types(Arena *arena,
RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off);
type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);
type->kind = RDI_TypeKind_IncompleteEnum; type->kind = RDI_TypeKind_IncompleteEnum;
d2r_tag_iterator_skip_children(it); d2r_tag_iter_skip_children(it);
} }
else else
{ {
@@ -1857,7 +1858,7 @@ d2r_convert_types(Arena *arena,
type->count = param_list.count; type->count = param_list.count;
type->param_types = rdim_array_from_type_list(arena, param_list); type->param_types = rdim_array_from_type_list(arena, param_list);
d2r_tag_iterator_skip_children(it); d2r_tag_iter_skip_children(it);
}break; }break;
case DW_TagKind_Typedef: case DW_TagKind_Typedef:
@@ -1877,107 +1878,92 @@ d2r_convert_types(Arena *arena,
case DW_TagKind_BaseType: case DW_TagKind_BaseType:
{ {
DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding); DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding);
U64 byte_size = dw_byte_size_from_tag(input, cu, tag); U64 byte_size = dw_byte_size_from_tag(input, cu, tag);
// convert base type encoding to RDI version // rjf: attribute type encoding -> RDI type kind
RDI_TypeKind kind = RDI_TypeKind_NULL; RDI_TypeKind kind = RDI_TypeKind_NULL;
switch (encoding) { switch(encoding)
case DW_ATE_Null: kind = RDI_TypeKind_NULL; break; {
case DW_ATE_Address: kind = RDI_TypeKind_Void; break; default:{}break;
case DW_ATE_Boolean: kind = RDI_TypeKind_Bool; break; case DW_ATE_Null: {kind = RDI_TypeKind_NULL;}break;
case DW_ATE_ComplexFloat: { case DW_ATE_Boolean: {kind = RDI_TypeKind_Bool;}break;
switch (byte_size) { case DW_ATE_ComplexFloat:
case 4: kind = RDI_TypeKind_ComplexF32; break; switch(byte_size)
case 8: kind = RDI_TypeKind_ComplexF64; break; {
case 10: kind = RDI_TypeKind_ComplexF80; break; case 4: {kind = RDI_TypeKind_ComplexF32;}break;
case 16: kind = RDI_TypeKind_ComplexF128; break; case 8: {kind = RDI_TypeKind_ComplexF64;}break;
default: AssertAlways(!"unexpected size"); break; // TODO: error handling case 10: {kind = RDI_TypeKind_ComplexF80;}break;
} case 16: {kind = RDI_TypeKind_ComplexF128;}break;
} break; default: {log_infof("Unsupported complex float size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break;
case DW_ATE_Float: { }break;
switch (byte_size) { case DW_ATE_Float:
case 2: kind = RDI_TypeKind_F16; break; switch(byte_size)
case 4: kind = RDI_TypeKind_F32; break; {
case 6: kind = RDI_TypeKind_F48; break; case 2: {kind = RDI_TypeKind_F16; }break;
case 8: kind = RDI_TypeKind_F64; break; case 4: {kind = RDI_TypeKind_F32; }break;
case 16: kind = RDI_TypeKind_F128; break; case 6: {kind = RDI_TypeKind_F48; }break;
default: AssertAlways(!"unexpected size"); break; // TODO: error handling case 8: {kind = RDI_TypeKind_F64; }break;
} case 16: {kind = RDI_TypeKind_F128;}break;
} break; default: {log_infof("Unsupported float size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break;
case DW_ATE_Signed: { }break;
switch (byte_size) { case DW_ATE_Signed:
case 1: kind = RDI_TypeKind_S8; break; switch(byte_size)
case 2: kind = RDI_TypeKind_S16; break; {
case 4: kind = RDI_TypeKind_S32; break; case 1: {kind = RDI_TypeKind_S8; }break;
case 8: kind = RDI_TypeKind_S64; break; case 2: {kind = RDI_TypeKind_S16; }break;
case 16: kind = RDI_TypeKind_S128; break; case 4: {kind = RDI_TypeKind_S32; }break;
case 32: kind = RDI_TypeKind_S256; break; case 8: {kind = RDI_TypeKind_S64; }break;
case 64: kind = RDI_TypeKind_S512; break; case 16: {kind = RDI_TypeKind_S128;}break;
default: AssertAlways(!"unexpected size"); break; // TODO: error handling case 32: {kind = RDI_TypeKind_S256;}break;
} case 64: {kind = RDI_TypeKind_S512;}break;
} break; default: {log_infof("Unsupported signed integer size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break;
case DW_ATE_SignedChar: { }break;
switch (byte_size) { case DW_ATE_SignedChar:
case 1: kind = RDI_TypeKind_Char8; break; switch(byte_size)
case 2: kind = RDI_TypeKind_Char16; break; {
case 4: kind = RDI_TypeKind_Char32; break; case 1: {kind = RDI_TypeKind_Char8; }break;
default: AssertAlways(!"unexpected size"); break; // TODO: error handling case 2: {kind = RDI_TypeKind_Char16;}break;
} case 4: {kind = RDI_TypeKind_Char32;}break;
} break; default:{log_infof("Unsupported signed character size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break;
case DW_ATE_Unsigned: { }break;
switch (byte_size) { case DW_ATE_Address:
case 1: kind = RDI_TypeKind_U8; break; case DW_ATE_Unsigned:
case 2: kind = RDI_TypeKind_U16; break; switch(byte_size)
case 4: kind = RDI_TypeKind_U32; break; {
case 8: kind = RDI_TypeKind_U64; break; case 1: {kind = RDI_TypeKind_U8; }break;
case 16: kind = RDI_TypeKind_U128; break; case 2: {kind = RDI_TypeKind_U16; }break;
case 32: kind = RDI_TypeKind_U256; break; case 4: {kind = RDI_TypeKind_U32; }break;
case 64: kind = RDI_TypeKind_U512; break; case 8: {kind = RDI_TypeKind_U64; }break;
default: AssertAlways(!"unexpected size"); break; // TODO: error handling case 16: {kind = RDI_TypeKind_U128;}break;
} case 32: {kind = RDI_TypeKind_U256;}break;
} break; case 64: {kind = RDI_TypeKind_U512;}break;
case DW_ATE_UnsignedChar: { default:{log_infof("Unsupported unsigned integer size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break;
switch (byte_size) { }break;
case 1: kind = RDI_TypeKind_UChar8; break; case DW_ATE_UnsignedChar:
case 2: kind = RDI_TypeKind_UChar16; break; switch(byte_size)
case 4: kind = RDI_TypeKind_UChar32; break; {
default: AssertAlways(!"unexpected size"); break; // TODO: error handling case 1: {kind = RDI_TypeKind_UChar8; }break;
} case 2: {kind = RDI_TypeKind_UChar16;}break;
} break; case 4: {kind = RDI_TypeKind_UChar32;}break;
case DW_ATE_ImaginaryFloat: { default:{log_infof("Unsupported unsigned character size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break;
NotImplemented; }break;
} break; case DW_ATE_ImaginaryFloat:
case DW_ATE_PackedDecimal: { case DW_ATE_PackedDecimal:
NotImplemented; case DW_ATE_NumericString:
} break; case DW_ATE_Edited:
case DW_ATE_NumericString: { case DW_ATE_SignedFixed:
NotImplemented; case DW_ATE_UnsignedFixed:
} break; case DW_ATE_DecimalFloat:
case DW_ATE_Edited: { case DW_ATE_Utf:
NotImplemented; case DW_ATE_Ucs:
} break; case DW_ATE_Ascii:
case DW_ATE_SignedFixed: { {
NotImplemented; // TODO(rjf): not implemented
} break; }break;
case DW_ATE_UnsignedFixed: {
NotImplemented;
} break;
case DW_ATE_DecimalFloat: {
NotImplemented;
} break;
case DW_ATE_Utf: {
NotImplemented;
} break;
case DW_ATE_Ucs: {
NotImplemented;
} break;
case DW_ATE_Ascii: {
NotImplemented;
} break;
default: AssertAlways(!"unexpected base type encoding"); break; // TODO: error handling
} }
// rjf: build
RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off);
type->kind = RDI_TypeKind_Alias; type->kind = RDI_TypeKind_Alias;
type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);
@@ -1998,9 +1984,7 @@ d2r_convert_types(Arena *arena,
Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_AddressClass)); Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_AddressClass));
U64 byte_size = arch_addr_size; U64 byte_size = arch_addr_size;
if (cu->version == DW_Version_5 || cu->relaxed) { dw_try_byte_size_from_tag(input, cu, tag, &byte_size);
dw_try_byte_size_from_tag(input, cu, tag, &byte_size);
}
RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off);
type->kind = RDI_TypeKind_Ptr; type->kind = RDI_TypeKind_Ptr;
@@ -2126,7 +2110,7 @@ d2r_convert_types(Arena *arena,
direct_type = t; direct_type = t;
} }
d2r_tag_iterator_skip_children(it); d2r_tag_iter_skip_children(it);
}break; }break;
case DW_TagKind_SubrangeType: case DW_TagKind_SubrangeType:
@@ -2137,7 +2121,7 @@ d2r_convert_types(Arena *arena,
case DW_TagKind_Inheritance: case DW_TagKind_Inheritance:
{ {
DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);
if (parent_tag.kind != DW_TagKind_StructureType && parent_tag.kind != DW_TagKind_ClassType) { if (parent_tag.kind != DW_TagKind_StructureType && parent_tag.kind != DW_TagKind_ClassType) {
// TODO: error handling // TODO: error handling
AssertAlways(!"unexpected parent tag"); AssertAlways(!"unexpected parent tag");
@@ -2169,14 +2153,17 @@ d2r_convert_udts(Arena *arena,
DW_TagNode *root) DW_TagNode *root)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root);
it->tag_node != 0;
d2r_tag_iter_next(scratch.arena, it))
{
DW_TagNode *tag_node = it->tag_node; DW_TagNode *tag_node = it->tag_node;
DW_Tag tag = tag_node->tag; DW_Tag tag = tag_node->tag;
switch (tag.kind) { switch (tag.kind) {
case DW_TagKind_ClassType: { case DW_TagKind_ClassType: {
B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration);
if (is_decl) { if (is_decl) {
d2r_tag_iterator_skip_children(it); d2r_tag_iter_skip_children(it);
} else { } else {
RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off);
RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP);
@@ -2187,7 +2174,7 @@ d2r_convert_udts(Arena *arena,
case DW_TagKind_StructureType: { case DW_TagKind_StructureType: {
B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration);
if (is_decl) { if (is_decl) {
d2r_tag_iterator_skip_children(it); d2r_tag_iter_skip_children(it);
} else { } else {
RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off);
RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP);
@@ -2198,7 +2185,7 @@ d2r_convert_udts(Arena *arena,
case DW_TagKind_UnionType: { case DW_TagKind_UnionType: {
B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration);
if (is_decl) { if (is_decl) {
d2r_tag_iterator_skip_children(it); d2r_tag_iter_skip_children(it);
} else { } else {
RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off);
RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP);
@@ -2209,7 +2196,7 @@ d2r_convert_udts(Arena *arena,
case DW_TagKind_EnumerationType: { case DW_TagKind_EnumerationType: {
B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration);
if (is_decl) { if (is_decl) {
d2r_tag_iterator_skip_children(it); d2r_tag_iter_skip_children(it);
} else { } else {
RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off);
RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP);
@@ -2218,7 +2205,7 @@ d2r_convert_udts(Arena *arena,
} }
} break; } break;
case DW_TagKind_Member: { case DW_TagKind_Member: {
DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);
B32 is_parent_udt = parent_tag.kind == DW_TagKind_StructureType || B32 is_parent_udt = parent_tag.kind == DW_TagKind_StructureType ||
parent_tag.kind == DW_TagKind_ClassType || parent_tag.kind == DW_TagKind_ClassType ||
parent_tag.kind == DW_TagKind_UnionType; parent_tag.kind == DW_TagKind_UnionType;
@@ -2241,7 +2228,7 @@ d2r_convert_udts(Arena *arena,
} }
} break; } break;
case DW_TagKind_Enumerator: { case DW_TagKind_Enumerator: {
DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);
if (parent_tag.kind == DW_TagKind_EnumerationType) { if (parent_tag.kind == DW_TagKind_EnumerationType) {
RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off); RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off);
RDIM_UDTEnumVal *udt_member = rdim_udt_push_enum_val(arena, &udts, parent_type->udt); RDIM_UDTEnumVal *udt_member = rdim_udt_push_enum_val(arena, &udts, parent_type->udt);
@@ -2258,12 +2245,12 @@ d2r_convert_udts(Arena *arena,
} }
internal void internal void
d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_scope, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root) d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
for(D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root);
it->tag_node != 0; it->tag_node != 0;
d2r_tag_iterator_next(scratch.arena, it)) d2r_tag_iter_next(scratch.arena, it))
{ {
DW_TagNode *tag_node = it->tag_node; DW_TagNode *tag_node = it->tag_node;
DW_Tag tag = tag_node->tag; DW_Tag tag = tag_node->tag;
@@ -2292,7 +2279,7 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_
case DW_TagKind_Enumerator: case DW_TagKind_Enumerator:
case DW_TagKind_Member: case DW_TagKind_Member:
{ {
d2r_tag_iterator_skip_children(it); d2r_tag_iter_skip_children(it);
}break; }break;
case DW_TagKind_SubProgram: case DW_TagKind_SubProgram:
@@ -2345,7 +2332,7 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_
proc->location_cases = d2r_locset_from_attrib(arena, &scopes, root_scope, &locations, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase); proc->location_cases = d2r_locset_from_attrib(arena, &scopes, root_scope, &locations, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase);
// sub program with user-defined parent tag is a method // sub program with user-defined parent tag is a method
DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);
if (parent_tag.kind == DW_TagKind_ClassType || parent_tag.kind == DW_TagKind_StructureType) { if (parent_tag.kind == DW_TagKind_ClassType || parent_tag.kind == DW_TagKind_StructureType) {
RDI_MemberKind member_kind = RDI_MemberKind_NULL; RDI_MemberKind member_kind = RDI_MemberKind_NULL;
DW_VirtualityKind virtuality = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Virtuality); DW_VirtualityKind virtuality = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Virtuality);
@@ -2371,7 +2358,7 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_
case DW_Inl_DeclaredInlined: case DW_Inl_DeclaredInlined:
case DW_Inl_Inlined: case DW_Inl_Inlined:
{ {
d2r_tag_iterator_skip_children(it); d2r_tag_iter_skip_children(it);
}break; }break;
default:{}break; default:{}break;
} }
@@ -2417,7 +2404,7 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_
String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);
RDIM_Type *type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type);
DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);
if (parent_tag.kind == DW_TagKind_SubProgram || if (parent_tag.kind == DW_TagKind_SubProgram ||
parent_tag.kind == DW_TagKind_InlinedSubroutine || parent_tag.kind == DW_TagKind_InlinedSubroutine ||
parent_tag.kind == DW_TagKind_LexicalBlock) { parent_tag.kind == DW_TagKind_LexicalBlock) {
@@ -2477,7 +2464,7 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_
case DW_TagKind_FormalParameter: case DW_TagKind_FormalParameter:
{ {
DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);
if (parent_tag.kind == DW_TagKind_SubProgram || parent_tag.kind == DW_TagKind_InlinedSubroutine) { if (parent_tag.kind == DW_TagKind_SubProgram || parent_tag.kind == DW_TagKind_InlinedSubroutine) {
RDIM_Scope *scope = it->stack->next->scope; RDIM_Scope *scope = it->stack->next->scope;
RDIM_Local *param = rdim_scope_push_local(arena, &scopes, scope); RDIM_Local *param = rdim_scope_push_local(arena, &scopes, scope);
@@ -2494,7 +2481,7 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_
case DW_TagKind_LexicalBlock: case DW_TagKind_LexicalBlock:
{ {
DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);
if(parent_tag.kind == DW_TagKind_SubProgram || if(parent_tag.kind == DW_TagKind_SubProgram ||
parent_tag.kind == DW_TagKind_InlinedSubroutine || parent_tag.kind == DW_TagKind_InlinedSubroutine ||
parent_tag.kind == DW_TagKind_LexicalBlock) parent_tag.kind == DW_TagKind_LexicalBlock)
@@ -2564,9 +2551,9 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
case ExecutableImageKind_CoffPe: case ExecutableImageKind_CoffPe:
{ {
PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, params->exe_data); PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, params->exe_data);
String8 raw_sections = str8_substr(params->exe_data, pe.section_table_range); String8 raw_sections = str8_substr(params->exe_data, pe.section_table_range);
COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count); COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count);
String8 string_table = str8_substr(params->exe_data, pe.string_table_range); String8 string_table = str8_substr(params->exe_data, pe.string_table_range);
arch = pe.arch; arch = pe.arch;
image_base = pe.image_base; image_base = pe.image_base;
binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table); binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table);
@@ -2608,12 +2595,38 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
//////////////////////////// ////////////////////////////
//- rjf: unpack input image info //- rjf: unpack input image info
// //
top_level_info = rdim_make_top_level_info(params->exe_name, arch, exe_hash, binary_sections); {
// rjf: base arch -> rdi
//////////////////////////// RDI_Arch arch_rdi = RDI_Arch_NULL;
//- rjf: build global scope switch(arch)
// {
RDIM_Scope *global_scope = rdim_scope_chunk_list_push(arena, &scopes, SCOPE_CHUNK_CAP); case Arch_Null:
case Arch_arm64:
case Arch_arm32:
case Arch_COUNT:
{}break;
case Arch_x64:{arch_rdi = RDI_Arch_X64;}break;
case Arch_x86:{arch_rdi = RDI_Arch_X86;}break;
}
// rjf: binary sections -> voff max
U64 exe_voff_max = 0;
for EachNode(sect_n, RDIM_BinarySectionNode, binary_sections.first)
{
exe_voff_max = Max(exe_voff_max, sect_n->v.voff_opl);
}
// rjf: fill
top_level_info.arch = arch_rdi;
top_level_info.exe_name = params->exe_name;
top_level_info.exe_hash = exe_hash;
top_level_info.voff_max = exe_voff_max;
if(!params->deterministic)
{
// TODO(rjf): top_level_info.guid = ...;
top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL);
}
}
//////////////////////////// ////////////////////////////
//- rjf: parse unit contribution map //- rjf: parse unit contribution map
@@ -2892,8 +2905,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, file_line_count); RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, file_line_count);
rdim_src_file_push_line_sequence(arena, &src_files, src_file, line_seq); rdim_src_file_push_line_sequence(arena, &src_files, src_file, line_seq);
} }
//Assert(line_idx == line_seq->count);
} }
} }
} }
@@ -2912,7 +2923,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
type->byte_size = rdi_size_from_basic_type_kind(type_kind); type->byte_size = rdi_size_from_basic_type_kind(type_kind);
builtin_types[type_kind] = type; builtin_types[type_kind] = type;
} }
builtin_types[RDI_TypeKind_Void]->byte_size = arch_addr_size;
builtin_types[RDI_TypeKind_Handle]->byte_size = arch_addr_size; builtin_types[RDI_TypeKind_Handle]->byte_size = arch_addr_size;
builtin_types[RDI_TypeKind_Variadic] = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP); builtin_types[RDI_TypeKind_Variadic] = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP);
builtin_types[RDI_TypeKind_Variadic]->kind = RDI_TypeKind_Variadic; builtin_types[RDI_TypeKind_Variadic]->kind = RDI_TypeKind_Variadic;
@@ -2962,7 +2972,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
// convert debug info // convert debug info
d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root);
d2r_convert_udts(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); d2r_convert_udts(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root);
d2r_convert_symbols(arena, type_table, global_scope, &input, cu, cu_lang, arch_addr_size, image_base, arch, tag_tree.root); d2r_convert_symbols(arena, type_table, &input, cu, cu_lang, arch_addr_size, image_base, arch, tag_tree.root);
RDIM_Rng1U64ChunkList cu_voff_ranges = {0}; RDIM_Rng1U64ChunkList cu_voff_ranges = {0};
if(cu_idx < cu_contrib_map.count) if(cu_idx < cu_contrib_map.count)
@@ -2996,6 +3006,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
temp_end(comp_temp); temp_end(comp_temp);
} }
} }
} }
lane_sync(); lane_sync();
RDIM_BakeParams bake_params = {0}; RDIM_BakeParams bake_params = {0};
+26 -21
View File
@@ -22,35 +22,40 @@ struct D2R_ConvertParams
//////////////////////////////// ////////////////////////////////
//~ rjf: Conversion Helper Types //~ rjf: Conversion Helper Types
typedef struct D2R_TypeTable typedef struct D2R_TypeTable D2R_TypeTable;
struct D2R_TypeTable
{ {
HashTable *ht; HashTable *ht;
RDIM_TypeChunkList *types; RDIM_TypeChunkList *types;
U64 type_chunk_cap; U64 type_chunk_cap;
RDIM_Type **builtin_types; RDIM_Type **builtin_types;
} D2R_TypeTable; };
typedef struct D2R_TagFrame typedef struct D2R_TagFrame D2R_TagFrame;
struct D2R_TagFrame
{ {
DW_TagNode *node; DW_TagNode *node;
RDIM_Scope *scope; RDIM_Scope *scope;
struct D2R_TagFrame *next; struct D2R_TagFrame *next;
} D2R_TagFrame; };
typedef struct D2R_TagIterator typedef struct D2R_TagIter D2R_TagIter;
struct D2R_TagIter
{ {
D2R_TagFrame *free_list; D2R_TagFrame *free_list;
D2R_TagFrame *stack; D2R_TagFrame *stack;
DW_TagNode *tag_node; DW_TagNode *tag_node;
B32 visit_children; DW_TagNode *root;
} D2R_TagIterator; B32 visit_children;
};
typedef struct D2R_CompUnitContribMap typedef struct D2R_CompUnitContribMap D2R_CompUnitContribMap;
struct D2R_CompUnitContribMap
{ {
U64 count; U64 count;
U64 *info_off_arr; U64 *info_off_arr;
RDIM_Rng1U64ChunkList *voff_range_arr; RDIM_Rng1U64ChunkList *voff_range_arr;
} D2R_CompUnitContribMap; };
#define D2R_ValueType_IsSigned(x) ((x) == D2R_ValueType_S8 || (x) == D2R_ValueType_S16 || (x) == D2R_ValueType_S32 || (x) == D2R_ValueType_S64 || (x) == D2R_ValueType_S128 || (x) == D2R_ValueType_S256 || (x) == D2R_ValueType_S512) #define D2R_ValueType_IsSigned(x) ((x) == D2R_ValueType_S8 || (x) == D2R_ValueType_S16 || (x) == D2R_ValueType_S32 || (x) == D2R_ValueType_S64 || (x) == D2R_ValueType_S128 || (x) == D2R_ValueType_S256 || (x) == D2R_ValueType_S512)
#define D2R_ValueType_IsUnsigned(x) ((x) == D2R_ValueType_U8 || (x) == D2R_ValueType_U16 || (x) == D2R_ValueType_U32 || (x) == D2R_ValueType_U64 || (x) == D2R_ValueType_U128 || (x) == D2R_ValueType_U256 || (x) == D2R_ValueType_U512) #define D2R_ValueType_IsUnsigned(x) ((x) == D2R_ValueType_U8 || (x) == D2R_ValueType_U16 || (x) == D2R_ValueType_U32 || (x) == D2R_ValueType_U64 || (x) == D2R_ValueType_U128 || (x) == D2R_ValueType_U256 || (x) == D2R_ValueType_U512)
@@ -150,11 +155,11 @@ internal RDIM_Scope *d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U
//////////////////////////////// ////////////////////////////////
//~ Tag Iterator //~ Tag Iterator
internal D2R_TagIterator * d2r_tag_iterator_init(Arena *arena, DW_TagNode *root); internal D2R_TagIter *d2r_tag_iter_init(Arena *arena, DW_TagNode *root);
internal void d2r_tag_iterator_next(Arena *arena, D2R_TagIterator *iter); internal void d2r_tag_iter_next(Arena *arena, D2R_TagIter *iter);
internal void d2r_tag_iterator_skip_children(D2R_TagIterator *iter); internal void d2r_tag_iter_skip_children(D2R_TagIter *iter);
internal DW_TagNode * d2r_tag_iterator_parent_tag_node(D2R_TagIterator *iter); internal DW_TagNode * d2r_tag_iter_parent_tag_node(D2R_TagIter *iter);
internal DW_Tag d2r_tag_iterator_parent_tag(D2R_TagIterator *iter); internal DW_Tag d2r_tag_iter_parent_tag(D2R_TagIter *iter);
//////////////////////////////// ////////////////////////////////
//~ Type/UDT/Symbol Conversion //~ Type/UDT/Symbol Conversion
@@ -166,7 +171,7 @@ internal RDIM_Type *d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_t
internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root);
internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root);
internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_scope, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root); internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root);
//////////////////////////////// ////////////////////////////////
//~ rjf: Main Conversion Entry Point //~ rjf: Main Conversion Entry Point
-29
View File
@@ -17,35 +17,6 @@ rdim_data_model_from_os_arch(OperatingSystem os, RDI_Arch arch)
return data_model; return data_model;
} }
internal RDIM_TopLevelInfo
rdim_make_top_level_info(String8 image_name, Arch arch, U64 exe_hash, RDIM_BinarySectionList sections)
{
// convert arch
RDI_Arch arch_rdi = RDI_Arch_NULL;
switch(arch)
{
default:{}break;
case Arch_x64:{arch_rdi = RDI_Arch_X64;}break;
case Arch_x86:{arch_rdi = RDI_Arch_X86;}break;
}
// find max VOFF
U64 exe_voff_max = 0;
for EachNode(sect_n, RDIM_BinarySectionNode, sections.first)
{
exe_voff_max = Max(exe_voff_max, sect_n->v.voff_opl);
}
// fill out top level info
RDIM_TopLevelInfo top_level_info = {0};
top_level_info.arch = arch_rdi;
top_level_info.exe_hash = exe_hash;
top_level_info.voff_max = exe_voff_max;
top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL);
return top_level_info;
}
internal RDIM_BakeResults internal RDIM_BakeResults
rdim_bake(Arena *arena, RDIM_BakeParams *params) rdim_bake(Arena *arena, RDIM_BakeParams *params)
{ {
-1
View File
@@ -161,7 +161,6 @@ struct RDIM_Shared
global RDIM_Shared *rdim_shared = 0; global RDIM_Shared *rdim_shared = 0;
internal RDIM_DataModel rdim_data_model_from_os_arch(OperatingSystem os, RDI_Arch arch); internal RDIM_DataModel rdim_data_model_from_os_arch(OperatingSystem os, RDI_Arch arch);
internal RDIM_TopLevelInfo rdim_make_top_level_info(String8 image_name, Arch arch, U64 exe_hash, RDIM_BinarySectionList sections);
internal RDIM_BakeResults rdim_bake(Arena *arena, RDIM_BakeParams *params); internal RDIM_BakeResults rdim_bake(Arena *arena, RDIM_BakeParams *params);
internal RDIM_SerializedSectionBundle rdim_compress(Arena *arena, RDIM_SerializedSectionBundle *in); internal RDIM_SerializedSectionBundle rdim_compress(Arena *arena, RDIM_SerializedSectionBundle *in);