From 88867ac758909ab1eeb453721cc8ddd0f87bb43b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 19 Jun 2025 08:21:58 -0700 Subject: [PATCH] lib_rdi_format -> lib_rdi --- src/dwarf/dwarf_dump.h | 4 +- .../rdi_format.c => lib_rdi/rdi.c} | 720 ++-- .../rdi_format.h => lib_rdi/rdi.h} | 3148 ++++++++--------- .../rdi_parse.c} | 0 .../rdi_parse.h} | 466 +-- src/linker/lnk.c | 6 +- src/linker/rdi/rdi.c | 1 - src/linker/rdi/rdi.h | 4 - src/radbin/radbin_main.c | 4 +- src/raddbg/raddbg_main.c | 4 +- .../rdi_format.mdesk => rdi/rdi.mdesk} | 22 +- .../rdi_format_local.c => rdi/rdi_local.c} | 2514 ++++++------- .../rdi_format_local.h => rdi/rdi_local.h} | 204 +- 13 files changed, 3545 insertions(+), 3552 deletions(-) rename src/{lib_rdi_format/rdi_format.c => lib_rdi/rdi.c} (96%) rename src/{lib_rdi_format/rdi_format.h => lib_rdi/rdi.h} (96%) rename src/{lib_rdi_format/rdi_format_parse.c => lib_rdi/rdi_parse.c} (100%) rename src/{lib_rdi_format/rdi_format_parse.h => lib_rdi/rdi_parse.h} (96%) delete mode 100644 src/linker/rdi/rdi.c delete mode 100644 src/linker/rdi/rdi.h rename src/{rdi_format/rdi_format.mdesk => rdi/rdi.mdesk} (99%) rename src/{rdi_format/rdi_format_local.c => rdi/rdi_local.c} (97%) rename src/{rdi_format/rdi_format_local.h => rdi/rdi_local.h} (95%) diff --git a/src/dwarf/dwarf_dump.h b/src/dwarf/dwarf_dump.h index 66e2ff24..73c6ad7b 100644 --- a/src/dwarf/dwarf_dump.h +++ b/src/dwarf/dwarf_dump.h @@ -51,6 +51,7 @@ read_only global String8 dw_name_title_from_dump_subset_table[] = #undef X }; +internal String8 dw_string_from_reg_off(Arena *arena, Arch arch, U64 reg_idx, S64 reg_off); internal String8List dw_string_list_from_expression (Arena *arena, String8 raw_data, U64 cu_base, U64 address_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); internal String8 dw_format_expression_single_line(Arena *arena, String8 raw_data, U64 cu_base, U64 address_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); internal String8 dw_format_eh_ptr_enc (Arena *arena, DW_EhPtrEnc enc); @@ -71,7 +72,6 @@ internal void dw_print_debug_pubnames (Arena *arena, String8List *out, String8 internal void dw_print_debug_pubtypes (Arena *arena, String8List *out, String8 indent, DW_Input *input); internal void dw_print_debug_line_str (Arena *arena, String8List *out, String8 indent, DW_Input *input); internal void dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Input *input); -internal void -dw_format(Arena *arena, String8List *out, String8 indent, DW_DumpSubsetFlags subset_flags, DW_Input *input, Arch arch, ExecutableImageKind image_type); +internal void dw_format(Arena *arena, String8List *out, String8 indent, DW_DumpSubsetFlags subset_flags, DW_Input *input, Arch arch, ExecutableImageKind image_type); #endif // DWARF_DUMP_H diff --git a/src/lib_rdi_format/rdi_format.c b/src/lib_rdi/rdi.c similarity index 96% rename from src/lib_rdi_format/rdi_format.c rename to src/lib_rdi/rdi.c index 5d301b95..73760f04 100644 --- a/src/lib_rdi_format/rdi_format.c +++ b/src/lib_rdi/rdi.c @@ -1,360 +1,360 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////////////////////////////////////// -//~ RAD Debug Info, (R)AD(D)BG(I) Format Library -// -// Defines standard RDI debug information format types and -// functions. - -#ifndef RDI_FORMAT_C -#define RDI_FORMAT_C - -RDI_U16 rdi_section_element_size_table[40] = -{ -sizeof(RDI_U8), -sizeof(RDI_TopLevelInfo), -sizeof(RDI_U8), -sizeof(RDI_U32), -sizeof(RDI_U32), -sizeof(RDI_BinarySection), -sizeof(RDI_FilePathNode), -sizeof(RDI_SourceFile), -sizeof(RDI_LineTable), -sizeof(RDI_U64), -sizeof(RDI_Line), -sizeof(RDI_Column), -sizeof(RDI_SourceLineMap), -sizeof(RDI_U32), -sizeof(RDI_U32), -sizeof(RDI_U64), -sizeof(RDI_Unit), -sizeof(RDI_VMapEntry), -sizeof(RDI_TypeNode), -sizeof(RDI_UDT), -sizeof(RDI_Member), -sizeof(RDI_EnumMember), -sizeof(RDI_GlobalVariable), -sizeof(RDI_VMapEntry), -sizeof(RDI_ThreadVariable), -sizeof(RDI_Constant), -sizeof(RDI_Procedure), -sizeof(RDI_Scope), -sizeof(RDI_U64), -sizeof(RDI_VMapEntry), -sizeof(RDI_InlineSite), -sizeof(RDI_Local), -sizeof(RDI_LocationBlock), -sizeof(RDI_U8), -sizeof(RDI_U8), -sizeof(RDI_U32), -sizeof(RDI_NameMap), -sizeof(RDI_NameMapBucket), -sizeof(RDI_NameMapNode), -sizeof(RDI_U8), -}; - -RDI_U8 rdi_section_is_required_table[40] = -{ -0, -0, -1, -1, -1, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -}; - -RDI_U16 rdi_eval_op_ctrlbits_table[52] = -{ -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(1, 1, 0), -RDI_EVAL_CTRLBITS(2, 0, 0), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(0, 1, 1), -RDI_EVAL_CTRLBITS(8, 0, 1), -RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(1, 0, 1), -RDI_EVAL_CTRLBITS(2, 0, 1), -RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(8, 0, 1), -RDI_EVAL_CTRLBITS(16, 0, 1), -RDI_EVAL_CTRLBITS(1, 0, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(2, 1, 1), -RDI_EVAL_CTRLBITS(1, 0, 1), -RDI_EVAL_CTRLBITS(0, 1, 0), -RDI_EVAL_CTRLBITS(1, 0, 0), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(4, 0, 0), -RDI_EVAL_CTRLBITS(4, 0, 0), -RDI_EVAL_CTRLBITS(8, 0, 0), -RDI_EVAL_CTRLBITS(0, 0, 0), -}; - -struct {RDI_EvalConversionKind dst_typegroups[RDI_EvalTypeGroup_COUNT];} rdi_eval_typegroup_conversion_kind_matrix[6] = -{ -{{RDI_EvalConversionKind_OtherToOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop}}, -{{RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop}}, -}; - -struct {RDI_U8 *str; RDI_U64 size;} rdi_eval_conversion_kind_message_string_table[6] = -{ -{(RDI_U8 *)"", sizeof("")}, -{(RDI_U8 *)"", sizeof("")}, -{(RDI_U8 *)"Cannot convert between these types.", sizeof("Cannot convert between these types.")}, -{(RDI_U8 *)"Cannot convert to this type.", sizeof("Cannot convert to this type.")}, -{(RDI_U8 *)"Cannot convert this type.", sizeof("Cannot convert this type.")}, -{(RDI_U8 *)"", sizeof("")}, -}; - -RDI_PROC RDI_U64 -rdi_hash(RDI_U8 *ptr, RDI_U64 size) -{ - RDI_U64 result = 5381; - RDI_U8 *opl = ptr + size; - for(;ptr < opl; ptr += 1) - { - result = ((result << 5) + result) + *ptr; - } - return result; -} - -RDI_PROC RDI_U8 * -rdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out) -{ -RDI_U8 *result = 0; -*size_out = 0; -switch (kind) -{ -default:{}break; -case RDI_TypeKind_NULL: {result = (RDI_U8*)"NULL"; *size_out = sizeof("NULL")-1;}break; -case RDI_TypeKind_Void: {result = (RDI_U8*)"Void"; *size_out = sizeof("Void")-1;}break; -case RDI_TypeKind_Handle: {result = (RDI_U8*)"Handle"; *size_out = sizeof("Handle")-1;}break; -case RDI_TypeKind_HResult: {result = (RDI_U8*)"HResult"; *size_out = sizeof("HResult")-1;}break; -case RDI_TypeKind_Char8: {result = (RDI_U8*)"Char8"; *size_out = sizeof("Char8")-1;}break; -case RDI_TypeKind_Char16: {result = (RDI_U8*)"Char16"; *size_out = sizeof("Char16")-1;}break; -case RDI_TypeKind_Char32: {result = (RDI_U8*)"Char32"; *size_out = sizeof("Char32")-1;}break; -case RDI_TypeKind_UChar8: {result = (RDI_U8*)"UChar8"; *size_out = sizeof("UChar8")-1;}break; -case RDI_TypeKind_UChar16: {result = (RDI_U8*)"UChar16"; *size_out = sizeof("UChar16")-1;}break; -case RDI_TypeKind_UChar32: {result = (RDI_U8*)"UChar32"; *size_out = sizeof("UChar32")-1;}break; -case RDI_TypeKind_U8: {result = (RDI_U8*)"U8"; *size_out = sizeof("U8")-1;}break; -case RDI_TypeKind_U16: {result = (RDI_U8*)"U16"; *size_out = sizeof("U16")-1;}break; -case RDI_TypeKind_U32: {result = (RDI_U8*)"U32"; *size_out = sizeof("U32")-1;}break; -case RDI_TypeKind_U64: {result = (RDI_U8*)"U64"; *size_out = sizeof("U64")-1;}break; -case RDI_TypeKind_U128: {result = (RDI_U8*)"U128"; *size_out = sizeof("U128")-1;}break; -case RDI_TypeKind_U256: {result = (RDI_U8*)"U256"; *size_out = sizeof("U256")-1;}break; -case RDI_TypeKind_U512: {result = (RDI_U8*)"U512"; *size_out = sizeof("U512")-1;}break; -case RDI_TypeKind_S8: {result = (RDI_U8*)"S8"; *size_out = sizeof("S8")-1;}break; -case RDI_TypeKind_S16: {result = (RDI_U8*)"S16"; *size_out = sizeof("S16")-1;}break; -case RDI_TypeKind_S32: {result = (RDI_U8*)"S32"; *size_out = sizeof("S32")-1;}break; -case RDI_TypeKind_S64: {result = (RDI_U8*)"S64"; *size_out = sizeof("S64")-1;}break; -case RDI_TypeKind_S128: {result = (RDI_U8*)"S128"; *size_out = sizeof("S128")-1;}break; -case RDI_TypeKind_S256: {result = (RDI_U8*)"S256"; *size_out = sizeof("S256")-1;}break; -case RDI_TypeKind_S512: {result = (RDI_U8*)"S512"; *size_out = sizeof("S512")-1;}break; -case RDI_TypeKind_Bool: {result = (RDI_U8*)"Bool"; *size_out = sizeof("Bool")-1;}break; -case RDI_TypeKind_F16: {result = (RDI_U8*)"F16"; *size_out = sizeof("F16")-1;}break; -case RDI_TypeKind_F32: {result = (RDI_U8*)"F32"; *size_out = sizeof("F32")-1;}break; -case RDI_TypeKind_F32PP: {result = (RDI_U8*)"F32PP"; *size_out = sizeof("F32PP")-1;}break; -case RDI_TypeKind_F48: {result = (RDI_U8*)"F48"; *size_out = sizeof("F48")-1;}break; -case RDI_TypeKind_F64: {result = (RDI_U8*)"F64"; *size_out = sizeof("F64")-1;}break; -case RDI_TypeKind_F80: {result = (RDI_U8*)"F80"; *size_out = sizeof("F80")-1;}break; -case RDI_TypeKind_F128: {result = (RDI_U8*)"F128"; *size_out = sizeof("F128")-1;}break; -case RDI_TypeKind_ComplexF32: {result = (RDI_U8*)"ComplexF32"; *size_out = sizeof("ComplexF32")-1;}break; -case RDI_TypeKind_ComplexF64: {result = (RDI_U8*)"ComplexF64"; *size_out = sizeof("ComplexF64")-1;}break; -case RDI_TypeKind_ComplexF80: {result = (RDI_U8*)"ComplexF80"; *size_out = sizeof("ComplexF80")-1;}break; -case RDI_TypeKind_ComplexF128: {result = (RDI_U8*)"ComplexF128"; *size_out = sizeof("ComplexF128")-1;}break; -case RDI_TypeKind_Modifier: {result = (RDI_U8*)"Modifier"; *size_out = sizeof("Modifier")-1;}break; -case RDI_TypeKind_Ptr: {result = (RDI_U8*)"Ptr"; *size_out = sizeof("Ptr")-1;}break; -case RDI_TypeKind_LRef: {result = (RDI_U8*)"LRef"; *size_out = sizeof("LRef")-1;}break; -case RDI_TypeKind_RRef: {result = (RDI_U8*)"RRef"; *size_out = sizeof("RRef")-1;}break; -case RDI_TypeKind_Array: {result = (RDI_U8*)"Array"; *size_out = sizeof("Array")-1;}break; -case RDI_TypeKind_Function: {result = (RDI_U8*)"Function"; *size_out = sizeof("Function")-1;}break; -case RDI_TypeKind_Method: {result = (RDI_U8*)"Method"; *size_out = sizeof("Method")-1;}break; -case RDI_TypeKind_MemberPtr: {result = (RDI_U8*)"MemberPtr"; *size_out = sizeof("MemberPtr")-1;}break; -case RDI_TypeKind_Struct: {result = (RDI_U8*)"Struct"; *size_out = sizeof("Struct")-1;}break; -case RDI_TypeKind_Class: {result = (RDI_U8*)"Class"; *size_out = sizeof("Class")-1;}break; -case RDI_TypeKind_Union: {result = (RDI_U8*)"Union"; *size_out = sizeof("Union")-1;}break; -case RDI_TypeKind_Enum: {result = (RDI_U8*)"Enum"; *size_out = sizeof("Enum")-1;}break; -case RDI_TypeKind_Alias: {result = (RDI_U8*)"Alias"; *size_out = sizeof("Alias")-1;}break; -case RDI_TypeKind_IncompleteStruct: {result = (RDI_U8*)"IncompleteStruct"; *size_out = sizeof("IncompleteStruct")-1;}break; -case RDI_TypeKind_IncompleteUnion: {result = (RDI_U8*)"IncompleteUnion"; *size_out = sizeof("IncompleteUnion")-1;}break; -case RDI_TypeKind_IncompleteClass: {result = (RDI_U8*)"IncompleteClass"; *size_out = sizeof("IncompleteClass")-1;}break; -case RDI_TypeKind_IncompleteEnum: {result = (RDI_U8*)"IncompleteEnum"; *size_out = sizeof("IncompleteEnum")-1;}break; -case RDI_TypeKind_Bitfield: {result = (RDI_U8*)"Bitfield"; *size_out = sizeof("Bitfield")-1;}break; -case RDI_TypeKind_Variadic: {result = (RDI_U8*)"Variadic"; *size_out = sizeof("Variadic")-1;}break; -case RDI_TypeKind_Count: {result = (RDI_U8*)"Count"; *size_out = sizeof("Count")-1;}break; -} -return result; -} - -RDI_PROC RDI_U32 -rdi_size_from_basic_type_kind(RDI_TypeKind kind) -{ -RDI_U32 result = 0; -switch(kind) -{ -default:{}break; -case RDI_TypeKind_Handle:{result = 0xFFFFFFFF;}break; -case RDI_TypeKind_HResult:{result = 4;}break; -case RDI_TypeKind_Char8:{result = 1;}break; -case RDI_TypeKind_Char16:{result = 2;}break; -case RDI_TypeKind_Char32:{result = 4;}break; -case RDI_TypeKind_UChar8:{result = 1;}break; -case RDI_TypeKind_UChar16:{result = 2;}break; -case RDI_TypeKind_UChar32:{result = 4;}break; -case RDI_TypeKind_U8:{result = 1;}break; -case RDI_TypeKind_U16:{result = 2;}break; -case RDI_TypeKind_U32:{result = 4;}break; -case RDI_TypeKind_U64:{result = 8;}break; -case RDI_TypeKind_U128:{result = 16;}break; -case RDI_TypeKind_U256:{result = 32;}break; -case RDI_TypeKind_U512:{result = 64;}break; -case RDI_TypeKind_S8:{result = 1;}break; -case RDI_TypeKind_S16:{result = 2;}break; -case RDI_TypeKind_S32:{result = 4;}break; -case RDI_TypeKind_S64:{result = 8;}break; -case RDI_TypeKind_S128:{result = 16;}break; -case RDI_TypeKind_S256:{result = 32;}break; -case RDI_TypeKind_S512:{result = 64;}break; -case RDI_TypeKind_Bool:{result = 1;}break; -case RDI_TypeKind_F16:{result = 2;}break; -case RDI_TypeKind_F32:{result = 4;}break; -case RDI_TypeKind_F32PP:{result = 4;}break; -case RDI_TypeKind_F48:{result = 6;}break; -case RDI_TypeKind_F64:{result = 8;}break; -case RDI_TypeKind_F80:{result = 10;}break; -case RDI_TypeKind_F128:{result = 16;}break; -case RDI_TypeKind_ComplexF32:{result = 8;}break; -case RDI_TypeKind_ComplexF64:{result = 16;}break; -case RDI_TypeKind_ComplexF80:{result = 20;}break; -case RDI_TypeKind_ComplexF128:{result = 32;}break; -} -return result; -} - -RDI_PROC RDI_U32 -rdi_addr_size_from_arch(RDI_Arch arch) -{ -RDI_U32 result = 0; -switch(arch) -{ -default:{}break; -case RDI_Arch_X86:{result = 4;}break; -case RDI_Arch_X64:{result = 8;}break; -} -return result; -} - -RDI_PROC RDI_EvalConversionKind -rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out) -{ - RDI_EvalConversionKind k = rdi_eval_typegroup_conversion_kind_matrix[in].dst_typegroups[out]; - return k; -} - -RDI_PROC RDI_S32 -rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group) -{ - RDI_S32 result = 0; - switch(op) - { - case RDI_EvalOp_Neg: case RDI_EvalOp_Add: case RDI_EvalOp_Sub: - case RDI_EvalOp_Mul: case RDI_EvalOp_Div: - case RDI_EvalOp_EqEq:case RDI_EvalOp_NtEq: - case RDI_EvalOp_LsEq:case RDI_EvalOp_GrEq: - case RDI_EvalOp_Less:case RDI_EvalOp_Grtr: - { - if(group != RDI_EvalTypeGroup_Other) - { - result = 1; - } - }break; - case RDI_EvalOp_Mod:case RDI_EvalOp_LShift:case RDI_EvalOp_RShift: - case RDI_EvalOp_BitNot:case RDI_EvalOp_BitAnd:case RDI_EvalOp_BitXor: - case RDI_EvalOp_BitOr:case RDI_EvalOp_LogNot:case RDI_EvalOp_LogAnd: - case RDI_EvalOp_LogOr: - { - if(group == RDI_EvalTypeGroup_S || group == RDI_EvalTypeGroup_U) - { - result = 1; - } - }break; - } - return result; -} - -RDI_PROC RDI_U8 * -rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out) -{ - *size_out = rdi_eval_conversion_kind_message_string_table[kind].size; - return rdi_eval_conversion_kind_message_string_table[kind].str; -} - -#endif // RDI_FORMAT_C +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////////////////////////////////////// +//~ (R)AD (D)ebug (I)nfo Format Library +// +// Defines standard RDI debug information format types and +// functions. + +#ifndef RDI_C +#define RDI_C + +RDI_U16 rdi_section_element_size_table[40] = +{ +sizeof(RDI_U8), +sizeof(RDI_TopLevelInfo), +sizeof(RDI_U8), +sizeof(RDI_U32), +sizeof(RDI_U32), +sizeof(RDI_BinarySection), +sizeof(RDI_FilePathNode), +sizeof(RDI_SourceFile), +sizeof(RDI_LineTable), +sizeof(RDI_U64), +sizeof(RDI_Line), +sizeof(RDI_Column), +sizeof(RDI_SourceLineMap), +sizeof(RDI_U32), +sizeof(RDI_U32), +sizeof(RDI_U64), +sizeof(RDI_Unit), +sizeof(RDI_VMapEntry), +sizeof(RDI_TypeNode), +sizeof(RDI_UDT), +sizeof(RDI_Member), +sizeof(RDI_EnumMember), +sizeof(RDI_GlobalVariable), +sizeof(RDI_VMapEntry), +sizeof(RDI_ThreadVariable), +sizeof(RDI_Constant), +sizeof(RDI_Procedure), +sizeof(RDI_Scope), +sizeof(RDI_U64), +sizeof(RDI_VMapEntry), +sizeof(RDI_InlineSite), +sizeof(RDI_Local), +sizeof(RDI_LocationBlock), +sizeof(RDI_U8), +sizeof(RDI_U8), +sizeof(RDI_U32), +sizeof(RDI_NameMap), +sizeof(RDI_NameMapBucket), +sizeof(RDI_NameMapNode), +sizeof(RDI_U8), +}; + +RDI_U8 rdi_section_is_required_table[40] = +{ +0, +0, +1, +1, +1, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +}; + +RDI_U16 rdi_eval_op_ctrlbits_table[52] = +{ +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(1, 1, 0), +RDI_EVAL_CTRLBITS(2, 0, 0), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(0, 1, 1), +RDI_EVAL_CTRLBITS(8, 0, 1), +RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(1, 0, 1), +RDI_EVAL_CTRLBITS(2, 0, 1), +RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(8, 0, 1), +RDI_EVAL_CTRLBITS(16, 0, 1), +RDI_EVAL_CTRLBITS(1, 0, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(2, 1, 1), +RDI_EVAL_CTRLBITS(1, 0, 1), +RDI_EVAL_CTRLBITS(0, 1, 0), +RDI_EVAL_CTRLBITS(1, 0, 0), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(4, 0, 0), +RDI_EVAL_CTRLBITS(4, 0, 0), +RDI_EVAL_CTRLBITS(8, 0, 0), +RDI_EVAL_CTRLBITS(0, 0, 0), +}; + +struct {RDI_EvalConversionKind dst_typegroups[RDI_EvalTypeGroup_COUNT];} rdi_eval_typegroup_conversion_kind_matrix[6] = +{ +{{RDI_EvalConversionKind_OtherToOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop}}, +{{RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop}}, +}; + +struct {RDI_U8 *str; RDI_U64 size;} rdi_eval_conversion_kind_message_string_table[6] = +{ +{(RDI_U8 *)"", sizeof("")}, +{(RDI_U8 *)"", sizeof("")}, +{(RDI_U8 *)"Cannot convert between these types.", sizeof("Cannot convert between these types.")}, +{(RDI_U8 *)"Cannot convert to this type.", sizeof("Cannot convert to this type.")}, +{(RDI_U8 *)"Cannot convert this type.", sizeof("Cannot convert this type.")}, +{(RDI_U8 *)"", sizeof("")}, +}; + +RDI_PROC RDI_U64 +rdi_hash(RDI_U8 *ptr, RDI_U64 size) +{ + RDI_U64 result = 5381; + RDI_U8 *opl = ptr + size; + for(;ptr < opl; ptr += 1) + { + result = ((result << 5) + result) + *ptr; + } + return result; +} + +RDI_PROC RDI_U8 * +rdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out) +{ +RDI_U8 *result = 0; +*size_out = 0; +switch (kind) +{ +default:{}break; +case RDI_TypeKind_NULL: {result = (RDI_U8*)"NULL"; *size_out = sizeof("NULL")-1;}break; +case RDI_TypeKind_Void: {result = (RDI_U8*)"Void"; *size_out = sizeof("Void")-1;}break; +case RDI_TypeKind_Handle: {result = (RDI_U8*)"Handle"; *size_out = sizeof("Handle")-1;}break; +case RDI_TypeKind_HResult: {result = (RDI_U8*)"HResult"; *size_out = sizeof("HResult")-1;}break; +case RDI_TypeKind_Char8: {result = (RDI_U8*)"Char8"; *size_out = sizeof("Char8")-1;}break; +case RDI_TypeKind_Char16: {result = (RDI_U8*)"Char16"; *size_out = sizeof("Char16")-1;}break; +case RDI_TypeKind_Char32: {result = (RDI_U8*)"Char32"; *size_out = sizeof("Char32")-1;}break; +case RDI_TypeKind_UChar8: {result = (RDI_U8*)"UChar8"; *size_out = sizeof("UChar8")-1;}break; +case RDI_TypeKind_UChar16: {result = (RDI_U8*)"UChar16"; *size_out = sizeof("UChar16")-1;}break; +case RDI_TypeKind_UChar32: {result = (RDI_U8*)"UChar32"; *size_out = sizeof("UChar32")-1;}break; +case RDI_TypeKind_U8: {result = (RDI_U8*)"U8"; *size_out = sizeof("U8")-1;}break; +case RDI_TypeKind_U16: {result = (RDI_U8*)"U16"; *size_out = sizeof("U16")-1;}break; +case RDI_TypeKind_U32: {result = (RDI_U8*)"U32"; *size_out = sizeof("U32")-1;}break; +case RDI_TypeKind_U64: {result = (RDI_U8*)"U64"; *size_out = sizeof("U64")-1;}break; +case RDI_TypeKind_U128: {result = (RDI_U8*)"U128"; *size_out = sizeof("U128")-1;}break; +case RDI_TypeKind_U256: {result = (RDI_U8*)"U256"; *size_out = sizeof("U256")-1;}break; +case RDI_TypeKind_U512: {result = (RDI_U8*)"U512"; *size_out = sizeof("U512")-1;}break; +case RDI_TypeKind_S8: {result = (RDI_U8*)"S8"; *size_out = sizeof("S8")-1;}break; +case RDI_TypeKind_S16: {result = (RDI_U8*)"S16"; *size_out = sizeof("S16")-1;}break; +case RDI_TypeKind_S32: {result = (RDI_U8*)"S32"; *size_out = sizeof("S32")-1;}break; +case RDI_TypeKind_S64: {result = (RDI_U8*)"S64"; *size_out = sizeof("S64")-1;}break; +case RDI_TypeKind_S128: {result = (RDI_U8*)"S128"; *size_out = sizeof("S128")-1;}break; +case RDI_TypeKind_S256: {result = (RDI_U8*)"S256"; *size_out = sizeof("S256")-1;}break; +case RDI_TypeKind_S512: {result = (RDI_U8*)"S512"; *size_out = sizeof("S512")-1;}break; +case RDI_TypeKind_Bool: {result = (RDI_U8*)"Bool"; *size_out = sizeof("Bool")-1;}break; +case RDI_TypeKind_F16: {result = (RDI_U8*)"F16"; *size_out = sizeof("F16")-1;}break; +case RDI_TypeKind_F32: {result = (RDI_U8*)"F32"; *size_out = sizeof("F32")-1;}break; +case RDI_TypeKind_F32PP: {result = (RDI_U8*)"F32PP"; *size_out = sizeof("F32PP")-1;}break; +case RDI_TypeKind_F48: {result = (RDI_U8*)"F48"; *size_out = sizeof("F48")-1;}break; +case RDI_TypeKind_F64: {result = (RDI_U8*)"F64"; *size_out = sizeof("F64")-1;}break; +case RDI_TypeKind_F80: {result = (RDI_U8*)"F80"; *size_out = sizeof("F80")-1;}break; +case RDI_TypeKind_F128: {result = (RDI_U8*)"F128"; *size_out = sizeof("F128")-1;}break; +case RDI_TypeKind_ComplexF32: {result = (RDI_U8*)"ComplexF32"; *size_out = sizeof("ComplexF32")-1;}break; +case RDI_TypeKind_ComplexF64: {result = (RDI_U8*)"ComplexF64"; *size_out = sizeof("ComplexF64")-1;}break; +case RDI_TypeKind_ComplexF80: {result = (RDI_U8*)"ComplexF80"; *size_out = sizeof("ComplexF80")-1;}break; +case RDI_TypeKind_ComplexF128: {result = (RDI_U8*)"ComplexF128"; *size_out = sizeof("ComplexF128")-1;}break; +case RDI_TypeKind_Modifier: {result = (RDI_U8*)"Modifier"; *size_out = sizeof("Modifier")-1;}break; +case RDI_TypeKind_Ptr: {result = (RDI_U8*)"Ptr"; *size_out = sizeof("Ptr")-1;}break; +case RDI_TypeKind_LRef: {result = (RDI_U8*)"LRef"; *size_out = sizeof("LRef")-1;}break; +case RDI_TypeKind_RRef: {result = (RDI_U8*)"RRef"; *size_out = sizeof("RRef")-1;}break; +case RDI_TypeKind_Array: {result = (RDI_U8*)"Array"; *size_out = sizeof("Array")-1;}break; +case RDI_TypeKind_Function: {result = (RDI_U8*)"Function"; *size_out = sizeof("Function")-1;}break; +case RDI_TypeKind_Method: {result = (RDI_U8*)"Method"; *size_out = sizeof("Method")-1;}break; +case RDI_TypeKind_MemberPtr: {result = (RDI_U8*)"MemberPtr"; *size_out = sizeof("MemberPtr")-1;}break; +case RDI_TypeKind_Struct: {result = (RDI_U8*)"Struct"; *size_out = sizeof("Struct")-1;}break; +case RDI_TypeKind_Class: {result = (RDI_U8*)"Class"; *size_out = sizeof("Class")-1;}break; +case RDI_TypeKind_Union: {result = (RDI_U8*)"Union"; *size_out = sizeof("Union")-1;}break; +case RDI_TypeKind_Enum: {result = (RDI_U8*)"Enum"; *size_out = sizeof("Enum")-1;}break; +case RDI_TypeKind_Alias: {result = (RDI_U8*)"Alias"; *size_out = sizeof("Alias")-1;}break; +case RDI_TypeKind_IncompleteStruct: {result = (RDI_U8*)"IncompleteStruct"; *size_out = sizeof("IncompleteStruct")-1;}break; +case RDI_TypeKind_IncompleteUnion: {result = (RDI_U8*)"IncompleteUnion"; *size_out = sizeof("IncompleteUnion")-1;}break; +case RDI_TypeKind_IncompleteClass: {result = (RDI_U8*)"IncompleteClass"; *size_out = sizeof("IncompleteClass")-1;}break; +case RDI_TypeKind_IncompleteEnum: {result = (RDI_U8*)"IncompleteEnum"; *size_out = sizeof("IncompleteEnum")-1;}break; +case RDI_TypeKind_Bitfield: {result = (RDI_U8*)"Bitfield"; *size_out = sizeof("Bitfield")-1;}break; +case RDI_TypeKind_Variadic: {result = (RDI_U8*)"Variadic"; *size_out = sizeof("Variadic")-1;}break; +case RDI_TypeKind_Count: {result = (RDI_U8*)"Count"; *size_out = sizeof("Count")-1;}break; +} +return result; +} + +RDI_PROC RDI_U32 +rdi_size_from_basic_type_kind(RDI_TypeKind kind) +{ +RDI_U32 result = 0; +switch(kind) +{ +default:{}break; +case RDI_TypeKind_Handle:{result = 0xFFFFFFFF;}break; +case RDI_TypeKind_HResult:{result = 4;}break; +case RDI_TypeKind_Char8:{result = 1;}break; +case RDI_TypeKind_Char16:{result = 2;}break; +case RDI_TypeKind_Char32:{result = 4;}break; +case RDI_TypeKind_UChar8:{result = 1;}break; +case RDI_TypeKind_UChar16:{result = 2;}break; +case RDI_TypeKind_UChar32:{result = 4;}break; +case RDI_TypeKind_U8:{result = 1;}break; +case RDI_TypeKind_U16:{result = 2;}break; +case RDI_TypeKind_U32:{result = 4;}break; +case RDI_TypeKind_U64:{result = 8;}break; +case RDI_TypeKind_U128:{result = 16;}break; +case RDI_TypeKind_U256:{result = 32;}break; +case RDI_TypeKind_U512:{result = 64;}break; +case RDI_TypeKind_S8:{result = 1;}break; +case RDI_TypeKind_S16:{result = 2;}break; +case RDI_TypeKind_S32:{result = 4;}break; +case RDI_TypeKind_S64:{result = 8;}break; +case RDI_TypeKind_S128:{result = 16;}break; +case RDI_TypeKind_S256:{result = 32;}break; +case RDI_TypeKind_S512:{result = 64;}break; +case RDI_TypeKind_Bool:{result = 1;}break; +case RDI_TypeKind_F16:{result = 2;}break; +case RDI_TypeKind_F32:{result = 4;}break; +case RDI_TypeKind_F32PP:{result = 4;}break; +case RDI_TypeKind_F48:{result = 6;}break; +case RDI_TypeKind_F64:{result = 8;}break; +case RDI_TypeKind_F80:{result = 10;}break; +case RDI_TypeKind_F128:{result = 16;}break; +case RDI_TypeKind_ComplexF32:{result = 8;}break; +case RDI_TypeKind_ComplexF64:{result = 16;}break; +case RDI_TypeKind_ComplexF80:{result = 20;}break; +case RDI_TypeKind_ComplexF128:{result = 32;}break; +} +return result; +} + +RDI_PROC RDI_U32 +rdi_addr_size_from_arch(RDI_Arch arch) +{ +RDI_U32 result = 0; +switch(arch) +{ +default:{}break; +case RDI_Arch_X86:{result = 4;}break; +case RDI_Arch_X64:{result = 8;}break; +} +return result; +} + +RDI_PROC RDI_EvalConversionKind +rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out) +{ + RDI_EvalConversionKind k = rdi_eval_typegroup_conversion_kind_matrix[in].dst_typegroups[out]; + return k; +} + +RDI_PROC RDI_S32 +rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group) +{ + RDI_S32 result = 0; + switch(op) + { + case RDI_EvalOp_Neg: case RDI_EvalOp_Add: case RDI_EvalOp_Sub: + case RDI_EvalOp_Mul: case RDI_EvalOp_Div: + case RDI_EvalOp_EqEq:case RDI_EvalOp_NtEq: + case RDI_EvalOp_LsEq:case RDI_EvalOp_GrEq: + case RDI_EvalOp_Less:case RDI_EvalOp_Grtr: + { + if(group != RDI_EvalTypeGroup_Other) + { + result = 1; + } + }break; + case RDI_EvalOp_Mod:case RDI_EvalOp_LShift:case RDI_EvalOp_RShift: + case RDI_EvalOp_BitNot:case RDI_EvalOp_BitAnd:case RDI_EvalOp_BitXor: + case RDI_EvalOp_BitOr:case RDI_EvalOp_LogNot:case RDI_EvalOp_LogAnd: + case RDI_EvalOp_LogOr: + { + if(group == RDI_EvalTypeGroup_S || group == RDI_EvalTypeGroup_U) + { + result = 1; + } + }break; + } + return result; +} + +RDI_PROC RDI_U8 * +rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out) +{ + *size_out = rdi_eval_conversion_kind_message_string_table[kind].size; + return rdi_eval_conversion_kind_message_string_table[kind].str; +} + +#endif // RDI_C diff --git a/src/lib_rdi_format/rdi_format.h b/src/lib_rdi/rdi.h similarity index 96% rename from src/lib_rdi_format/rdi_format.h rename to src/lib_rdi/rdi.h index 4127f15b..97eebe9c 100644 --- a/src/lib_rdi_format/rdi_format.h +++ b/src/lib_rdi/rdi.h @@ -1,1574 +1,1574 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////////////////////////////////////// -//~ RAD Debug Info, (R)AD(D)BG(I) Format Library -// -// Defines standard RDI debug information format types and -// functions. - -#ifndef RDI_FORMAT_H -#define RDI_FORMAT_H - -//////////////////////////////////////////////////////////////// -//~ Overridable Procedure Decoration - -#if !defined(RDI_PROC) -# define RDI_PROC static -#endif - -//////////////////////////////////////////////////////////////// -//~ Overridable Basic Integer Types - -#if !defined(RDI_U8) -# define RDI_U8 RDI_U8 -# define RDI_U16 RDI_U16 -# define RDI_U32 RDI_U32 -# define RDI_U64 RDI_U64 -# define RDI_S8 RDI_S8 -# define RDI_S16 RDI_S16 -# define RDI_S32 RDI_S32 -# define RDI_S64 RDI_S64 -#include -typedef uint8_t RDI_U8; -typedef uint16_t RDI_U16; -typedef uint32_t RDI_U32; -typedef uint64_t RDI_U64; -typedef int8_t RDI_S8; -typedef int16_t RDI_S16; -typedef int32_t RDI_S32; -typedef int64_t RDI_S64; -#endif - -//////////////////////////////////////////////////////////////// -//~ Overridable Enabling/Disabling Of Table Index Typechecking - -#if !defined(RDI_DISABLE_TABLE_INDEX_TYPECHECKING) -# define RDI_DISABLE_TABLE_INDEX_TYPECHECKING 0 -#endif - -//////////////////////////////////////////////////////////////// -//~ Format Constants - -// "raddbg\0\0" -#define RDI_MAGIC_CONSTANT 0x0000676264646172 -#define RDI_ENCODING_VERSION 12 - -//////////////////////////////////////////////////////////////// -//~ Format Types & Functions - -typedef RDI_U32 RDI_SectionKind; -typedef enum RDI_SectionKindEnum -{ -RDI_SectionKind_NULL = 0x0000, -RDI_SectionKind_TopLevelInfo = 0x0001, -RDI_SectionKind_StringData = 0x0002, -RDI_SectionKind_StringTable = 0x0003, -RDI_SectionKind_IndexRuns = 0x0004, -RDI_SectionKind_BinarySections = 0x0005, -RDI_SectionKind_FilePathNodes = 0x0006, -RDI_SectionKind_SourceFiles = 0x0007, -RDI_SectionKind_LineTables = 0x0008, -RDI_SectionKind_LineInfoVOffs = 0x0009, -RDI_SectionKind_LineInfoLines = 0x000A, -RDI_SectionKind_LineInfoColumns = 0x000B, -RDI_SectionKind_SourceLineMaps = 0x000C, -RDI_SectionKind_SourceLineMapNumbers = 0x000D, -RDI_SectionKind_SourceLineMapRanges = 0x000E, -RDI_SectionKind_SourceLineMapVOffs = 0x000F, -RDI_SectionKind_Units = 0x0010, -RDI_SectionKind_UnitVMap = 0x0011, -RDI_SectionKind_TypeNodes = 0x0012, -RDI_SectionKind_UDTs = 0x0013, -RDI_SectionKind_Members = 0x0014, -RDI_SectionKind_EnumMembers = 0x0015, -RDI_SectionKind_GlobalVariables = 0x0016, -RDI_SectionKind_GlobalVMap = 0x0017, -RDI_SectionKind_ThreadVariables = 0x0018, -RDI_SectionKind_Constants = 0x0019, -RDI_SectionKind_Procedures = 0x001A, -RDI_SectionKind_Scopes = 0x001B, -RDI_SectionKind_ScopeVOffData = 0x001C, -RDI_SectionKind_ScopeVMap = 0x001D, -RDI_SectionKind_InlineSites = 0x001E, -RDI_SectionKind_Locals = 0x001F, -RDI_SectionKind_LocationBlocks = 0x0020, -RDI_SectionKind_LocationData = 0x0021, -RDI_SectionKind_ConstantValueData = 0x0022, -RDI_SectionKind_ConstantValueTable = 0x0023, -RDI_SectionKind_NameMaps = 0x0024, -RDI_SectionKind_NameMapBuckets = 0x0025, -RDI_SectionKind_NameMapNodes = 0x0026, -RDI_SectionKind_COUNT = 0x0027, -} RDI_SectionKindEnum; - -typedef RDI_U32 RDI_SectionEncoding; -typedef enum RDI_SectionEncodingEnum -{ -RDI_SectionEncoding_Unpacked = 0, -RDI_SectionEncoding_LZB = 1, -} RDI_SectionEncodingEnum; - -typedef RDI_U32 RDI_Arch; -typedef enum RDI_ArchEnum -{ -RDI_Arch_NULL = 0, -RDI_Arch_X86 = 1, -RDI_Arch_X64 = 2, -} RDI_ArchEnum; - -typedef RDI_U8 RDI_RegCode; -typedef enum RDI_RegCodeEnum -{ -RDI_RegCode_nil, -} RDI_RegCodeEnum; - -typedef RDI_U8 RDI_RegCodeX86; -typedef enum RDI_RegCodeX86Enum -{ -RDI_RegCodeX86_nil = 0, -RDI_RegCodeX86_eax = 1, -RDI_RegCodeX86_ecx = 2, -RDI_RegCodeX86_edx = 3, -RDI_RegCodeX86_ebx = 4, -RDI_RegCodeX86_esp = 5, -RDI_RegCodeX86_ebp = 6, -RDI_RegCodeX86_esi = 7, -RDI_RegCodeX86_edi = 8, -RDI_RegCodeX86_fsbase = 9, -RDI_RegCodeX86_gsbase = 10, -RDI_RegCodeX86_eflags = 11, -RDI_RegCodeX86_eip = 12, -RDI_RegCodeX86_dr0 = 13, -RDI_RegCodeX86_dr1 = 14, -RDI_RegCodeX86_dr2 = 15, -RDI_RegCodeX86_dr3 = 16, -RDI_RegCodeX86_dr4 = 17, -RDI_RegCodeX86_dr5 = 18, -RDI_RegCodeX86_dr6 = 19, -RDI_RegCodeX86_dr7 = 20, -RDI_RegCodeX86_fpr0 = 21, -RDI_RegCodeX86_fpr1 = 22, -RDI_RegCodeX86_fpr2 = 23, -RDI_RegCodeX86_fpr3 = 24, -RDI_RegCodeX86_fpr4 = 25, -RDI_RegCodeX86_fpr5 = 26, -RDI_RegCodeX86_fpr6 = 27, -RDI_RegCodeX86_fpr7 = 28, -RDI_RegCodeX86_st0 = 29, -RDI_RegCodeX86_st1 = 30, -RDI_RegCodeX86_st2 = 31, -RDI_RegCodeX86_st3 = 32, -RDI_RegCodeX86_st4 = 33, -RDI_RegCodeX86_st5 = 34, -RDI_RegCodeX86_st6 = 35, -RDI_RegCodeX86_st7 = 36, -RDI_RegCodeX86_fcw = 37, -RDI_RegCodeX86_fsw = 38, -RDI_RegCodeX86_ftw = 39, -RDI_RegCodeX86_fop = 40, -RDI_RegCodeX86_fcs = 41, -RDI_RegCodeX86_fds = 42, -RDI_RegCodeX86_fip = 43, -RDI_RegCodeX86_fdp = 44, -RDI_RegCodeX86_mxcsr = 45, -RDI_RegCodeX86_mxcsr_mask = 46, -RDI_RegCodeX86_ss = 47, -RDI_RegCodeX86_cs = 48, -RDI_RegCodeX86_ds = 49, -RDI_RegCodeX86_es = 50, -RDI_RegCodeX86_fs = 51, -RDI_RegCodeX86_gs = 52, -RDI_RegCodeX86_ymm0 = 53, -RDI_RegCodeX86_ymm1 = 54, -RDI_RegCodeX86_ymm2 = 55, -RDI_RegCodeX86_ymm3 = 56, -RDI_RegCodeX86_ymm4 = 57, -RDI_RegCodeX86_ymm5 = 58, -RDI_RegCodeX86_ymm6 = 59, -RDI_RegCodeX86_ymm7 = 60, -} RDI_RegCodeX86Enum; - -typedef RDI_U8 RDI_RegCodeX64; -typedef enum RDI_RegCodeX64Enum -{ -RDI_RegCodeX64_nil = 0, -RDI_RegCodeX64_rax = 1, -RDI_RegCodeX64_rcx = 2, -RDI_RegCodeX64_rdx = 3, -RDI_RegCodeX64_rbx = 4, -RDI_RegCodeX64_rsp = 5, -RDI_RegCodeX64_rbp = 6, -RDI_RegCodeX64_rsi = 7, -RDI_RegCodeX64_rdi = 8, -RDI_RegCodeX64_r8 = 9, -RDI_RegCodeX64_r9 = 10, -RDI_RegCodeX64_r10 = 11, -RDI_RegCodeX64_r11 = 12, -RDI_RegCodeX64_r12 = 13, -RDI_RegCodeX64_r13 = 14, -RDI_RegCodeX64_r14 = 15, -RDI_RegCodeX64_r15 = 16, -RDI_RegCodeX64_es = 17, -RDI_RegCodeX64_cs = 18, -RDI_RegCodeX64_ss = 19, -RDI_RegCodeX64_ds = 20, -RDI_RegCodeX64_fs = 21, -RDI_RegCodeX64_gs = 22, -RDI_RegCodeX64_rip = 23, -RDI_RegCodeX64_rflags = 24, -RDI_RegCodeX64_dr0 = 25, -RDI_RegCodeX64_dr1 = 26, -RDI_RegCodeX64_dr2 = 27, -RDI_RegCodeX64_dr3 = 28, -RDI_RegCodeX64_dr4 = 29, -RDI_RegCodeX64_dr5 = 30, -RDI_RegCodeX64_dr6 = 31, -RDI_RegCodeX64_dr7 = 32, -RDI_RegCodeX64_st0 = 33, -RDI_RegCodeX64_st1 = 34, -RDI_RegCodeX64_st2 = 35, -RDI_RegCodeX64_st3 = 36, -RDI_RegCodeX64_st4 = 37, -RDI_RegCodeX64_st5 = 38, -RDI_RegCodeX64_st6 = 39, -RDI_RegCodeX64_st7 = 40, -RDI_RegCodeX64_fpr0 = 41, -RDI_RegCodeX64_fpr1 = 42, -RDI_RegCodeX64_fpr2 = 43, -RDI_RegCodeX64_fpr3 = 44, -RDI_RegCodeX64_fpr4 = 45, -RDI_RegCodeX64_fpr5 = 46, -RDI_RegCodeX64_fpr6 = 47, -RDI_RegCodeX64_fpr7 = 48, -RDI_RegCodeX64_zmm0 = 49, -RDI_RegCodeX64_zmm1 = 50, -RDI_RegCodeX64_zmm2 = 51, -RDI_RegCodeX64_zmm3 = 52, -RDI_RegCodeX64_zmm4 = 53, -RDI_RegCodeX64_zmm5 = 54, -RDI_RegCodeX64_zmm6 = 55, -RDI_RegCodeX64_zmm7 = 56, -RDI_RegCodeX64_zmm8 = 57, -RDI_RegCodeX64_zmm9 = 58, -RDI_RegCodeX64_zmm10 = 59, -RDI_RegCodeX64_zmm11 = 60, -RDI_RegCodeX64_zmm12 = 61, -RDI_RegCodeX64_zmm13 = 62, -RDI_RegCodeX64_zmm14 = 63, -RDI_RegCodeX64_zmm15 = 64, -RDI_RegCodeX64_zmm16 = 65, -RDI_RegCodeX64_zmm17 = 66, -RDI_RegCodeX64_zmm18 = 67, -RDI_RegCodeX64_zmm19 = 68, -RDI_RegCodeX64_zmm20 = 69, -RDI_RegCodeX64_zmm21 = 70, -RDI_RegCodeX64_zmm22 = 71, -RDI_RegCodeX64_zmm23 = 72, -RDI_RegCodeX64_zmm24 = 73, -RDI_RegCodeX64_zmm25 = 74, -RDI_RegCodeX64_zmm26 = 75, -RDI_RegCodeX64_zmm27 = 76, -RDI_RegCodeX64_zmm28 = 77, -RDI_RegCodeX64_zmm29 = 78, -RDI_RegCodeX64_zmm30 = 79, -RDI_RegCodeX64_zmm31 = 80, -RDI_RegCodeX64_k0 = 81, -RDI_RegCodeX64_k1 = 82, -RDI_RegCodeX64_k2 = 83, -RDI_RegCodeX64_k3 = 84, -RDI_RegCodeX64_k4 = 85, -RDI_RegCodeX64_k5 = 86, -RDI_RegCodeX64_k6 = 87, -RDI_RegCodeX64_k7 = 88, -RDI_RegCodeX64_mxcsr = 89, -RDI_RegCodeX64_fsbase = 90, -RDI_RegCodeX64_gsbase = 91, -RDI_RegCodeX64_fcw = 92, -RDI_RegCodeX64_fsw = 93, -RDI_RegCodeX64_ftw = 94, -RDI_RegCodeX64_fop = 95, -RDI_RegCodeX64_fcs = 96, -RDI_RegCodeX64_fds = 97, -RDI_RegCodeX64_fip = 98, -RDI_RegCodeX64_fdp = 99, -RDI_RegCodeX64_mxcsr_mask = 100, -} RDI_RegCodeX64Enum; - -typedef RDI_U32 RDI_BinarySectionFlags; -typedef enum RDI_BinarySectionFlagsEnum -{ -RDI_BinarySectionFlag_Read = 1<<0, -RDI_BinarySectionFlag_Write = 1<<1, -RDI_BinarySectionFlag_Execute = 1<<2, -} RDI_BinarySectionFlagsEnum; - -typedef RDI_U32 RDI_Language; -typedef enum RDI_LanguageEnum -{ -RDI_Language_NULL = 0, -RDI_Language_C = 1, -RDI_Language_CPlusPlus = 2, -RDI_Language_Masm = 3, -RDI_Language_COUNT = 4, -} RDI_LanguageEnum; - -typedef RDI_U16 RDI_TypeKind; -typedef enum RDI_TypeKindEnum -{ -RDI_TypeKind_NULL = 0x0000, -RDI_TypeKind_Void = 0x0001, -RDI_TypeKind_Handle = 0x0002, -RDI_TypeKind_HResult = 0x0003, -RDI_TypeKind_Char8 = 0x0004, -RDI_TypeKind_Char16 = 0x0005, -RDI_TypeKind_Char32 = 0x0006, -RDI_TypeKind_UChar8 = 0x0007, -RDI_TypeKind_UChar16 = 0x0008, -RDI_TypeKind_UChar32 = 0x0009, -RDI_TypeKind_U8 = 0x000A, -RDI_TypeKind_U16 = 0x000B, -RDI_TypeKind_U32 = 0x000C, -RDI_TypeKind_U64 = 0x000D, -RDI_TypeKind_U128 = 0x000E, -RDI_TypeKind_U256 = 0x000F, -RDI_TypeKind_U512 = 0x0010, -RDI_TypeKind_S8 = 0x0011, -RDI_TypeKind_S16 = 0x0012, -RDI_TypeKind_S32 = 0x0013, -RDI_TypeKind_S64 = 0x0014, -RDI_TypeKind_S128 = 0x0015, -RDI_TypeKind_S256 = 0x0016, -RDI_TypeKind_S512 = 0x0017, -RDI_TypeKind_Bool = 0x0018, -RDI_TypeKind_F16 = 0x0019, -RDI_TypeKind_F32 = 0x001A, -RDI_TypeKind_F32PP = 0x001B, -RDI_TypeKind_F48 = 0x001C, -RDI_TypeKind_F64 = 0x001D, -RDI_TypeKind_F80 = 0x001E, -RDI_TypeKind_F128 = 0x001F, -RDI_TypeKind_ComplexF32 = 0x0020, -RDI_TypeKind_ComplexF64 = 0x0021, -RDI_TypeKind_ComplexF80 = 0x0022, -RDI_TypeKind_ComplexF128 = 0x0023, -RDI_TypeKind_Modifier = 0x1000, -RDI_TypeKind_Ptr = 0x1001, -RDI_TypeKind_LRef = 0x1002, -RDI_TypeKind_RRef = 0x1003, -RDI_TypeKind_Array = 0x1004, -RDI_TypeKind_Function = 0x1005, -RDI_TypeKind_Method = 0x1006, -RDI_TypeKind_MemberPtr = 0x1007, -RDI_TypeKind_Struct = 0x2000, -RDI_TypeKind_Class = 0x2001, -RDI_TypeKind_Union = 0x2002, -RDI_TypeKind_Enum = 0x2003, -RDI_TypeKind_Alias = 0x2004, -RDI_TypeKind_IncompleteStruct = 0x2005, -RDI_TypeKind_IncompleteUnion = 0x2006, -RDI_TypeKind_IncompleteClass = 0x2007, -RDI_TypeKind_IncompleteEnum = 0x2008, -RDI_TypeKind_Bitfield = 0xF000, -RDI_TypeKind_Variadic = 0xF001, -RDI_TypeKind_Count = 0xF002, -RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, -RDI_TypeKind_LastBuiltIn = RDI_TypeKind_ComplexF128, -RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, -RDI_TypeKind_LastConstructed = RDI_TypeKind_MemberPtr, -RDI_TypeKind_FirstUserDefined = RDI_TypeKind_Struct, -RDI_TypeKind_LastRecord = RDI_TypeKind_Union, -RDI_TypeKind_FirstIncomplete = RDI_TypeKind_IncompleteStruct, -RDI_TypeKind_LastIncomplete = RDI_TypeKind_IncompleteEnum, -RDI_TypeKind_FirstRecord = RDI_TypeKind_Struct, -RDI_TypeKind_LastUserDefined = RDI_TypeKind_IncompleteEnum, -} RDI_TypeKindEnum; - -typedef RDI_U16 RDI_TypeModifierFlags; -typedef enum RDI_TypeModifierFlagsEnum -{ -RDI_TypeModifierFlag_Const = 1<<0, -RDI_TypeModifierFlag_Volatile = 1<<1, -RDI_TypeModifierFlag_Restrict = 1<<2, -} RDI_TypeModifierFlagsEnum; - -typedef RDI_U32 RDI_UDTFlags; -typedef enum RDI_UDTFlagsEnum -{ -RDI_UDTFlag_EnumMembers = 1<<0, -} RDI_UDTFlagsEnum; - -typedef RDI_U16 RDI_MemberKind; -typedef enum RDI_MemberKindEnum -{ -RDI_MemberKind_NULL = 0x0000, -RDI_MemberKind_DataField = 0x0001, -RDI_MemberKind_StaticData = 0x0002, -RDI_MemberKind_Method = 0x0100, -RDI_MemberKind_StaticMethod = 0x0101, -RDI_MemberKind_VirtualMethod = 0x0102, -RDI_MemberKind_VTablePtr = 0x0200, -RDI_MemberKind_Base = 0x0201, -RDI_MemberKind_VirtualBase = 0x0202, -RDI_MemberKind_NestedType = 0x0300, -} RDI_MemberKindEnum; - -typedef RDI_U32 RDI_LinkFlags; -typedef enum RDI_LinkFlagsEnum -{ -RDI_LinkFlag_External = 1<<0, -RDI_LinkFlag_TypeScoped = 1<<1, -RDI_LinkFlag_ProcScoped = 1<<2, -} RDI_LinkFlagsEnum; - -typedef RDI_U32 RDI_LocalKind; -typedef enum RDI_LocalKindEnum -{ -RDI_LocalKind_NULL = 0x0, -RDI_LocalKind_Parameter = 0x1, -RDI_LocalKind_Variable = 0x2, -} RDI_LocalKindEnum; - -typedef RDI_U8 RDI_LocationKind; -typedef enum RDI_LocationKindEnum -{ -RDI_LocationKind_NULL = 0x0, -RDI_LocationKind_AddrBytecodeStream = 0x1, -RDI_LocationKind_ValBytecodeStream = 0x2, -RDI_LocationKind_AddrRegPlusU16 = 0x3, -RDI_LocationKind_AddrAddrRegPlusU16 = 0x4, -RDI_LocationKind_ValReg = 0x5, -} RDI_LocationKindEnum; - -typedef RDI_U8 RDI_EvalOp; -typedef enum RDI_EvalOpEnum -{ -RDI_EvalOp_Stop = 0, -RDI_EvalOp_Noop = 1, -RDI_EvalOp_Cond = 2, -RDI_EvalOp_Skip = 3, -RDI_EvalOp_MemRead = 4, -RDI_EvalOp_RegRead = 5, -RDI_EvalOp_RegReadDyn = 6, -RDI_EvalOp_FrameOff = 7, -RDI_EvalOp_ModuleOff = 8, -RDI_EvalOp_TLSOff = 9, -RDI_EvalOp_ObjectOff = 10, -RDI_EvalOp_CFA = 11, -RDI_EvalOp_ConstU8 = 12, -RDI_EvalOp_ConstU16 = 13, -RDI_EvalOp_ConstU32 = 14, -RDI_EvalOp_ConstU64 = 15, -RDI_EvalOp_ConstU128 = 16, -RDI_EvalOp_ConstString = 17, -RDI_EvalOp_Abs = 18, -RDI_EvalOp_Neg = 19, -RDI_EvalOp_Add = 20, -RDI_EvalOp_Sub = 21, -RDI_EvalOp_Mul = 22, -RDI_EvalOp_Div = 23, -RDI_EvalOp_Mod = 24, -RDI_EvalOp_LShift = 25, -RDI_EvalOp_RShift = 26, -RDI_EvalOp_BitAnd = 27, -RDI_EvalOp_BitOr = 28, -RDI_EvalOp_BitXor = 29, -RDI_EvalOp_BitNot = 30, -RDI_EvalOp_LogAnd = 31, -RDI_EvalOp_LogOr = 32, -RDI_EvalOp_LogNot = 33, -RDI_EvalOp_EqEq = 34, -RDI_EvalOp_NtEq = 35, -RDI_EvalOp_LsEq = 36, -RDI_EvalOp_GrEq = 37, -RDI_EvalOp_Less = 38, -RDI_EvalOp_Grtr = 39, -RDI_EvalOp_Trunc = 40, -RDI_EvalOp_TruncSigned = 41, -RDI_EvalOp_Convert = 42, -RDI_EvalOp_Pick = 43, -RDI_EvalOp_Pop = 44, -RDI_EvalOp_Insert = 45, -RDI_EvalOp_ValueRead = 46, -RDI_EvalOp_ByteSwap = 47, -RDI_EvalOp_CallSiteValue = 48, -RDI_EvalOp_PartialValue = 49, -RDI_EvalOp_PartialValueBit = 50, -RDI_EvalOp_COUNT = 51, -} RDI_EvalOpEnum; - -typedef RDI_U8 RDI_EvalTypeGroup; -typedef enum RDI_EvalTypeGroupEnum -{ -RDI_EvalTypeGroup_Other = 0, -RDI_EvalTypeGroup_U = 1, -RDI_EvalTypeGroup_S = 2, -RDI_EvalTypeGroup_F32 = 3, -RDI_EvalTypeGroup_F64 = 4, -RDI_EvalTypeGroup_COUNT = 5, -} RDI_EvalTypeGroupEnum; - -typedef RDI_U8 RDI_EvalConversionKind; -typedef enum RDI_EvalConversionKindEnum -{ -RDI_EvalConversionKind_Noop = 0, -RDI_EvalConversionKind_Legal = 1, -RDI_EvalConversionKind_OtherToOther = 2, -RDI_EvalConversionKind_ToOther = 3, -RDI_EvalConversionKind_FromOther = 4, -RDI_EvalConversionKind_COUNT = 5, -} RDI_EvalConversionKindEnum; - -typedef RDI_U32 RDI_NameMapKind; -typedef enum RDI_NameMapKindEnum -{ -RDI_NameMapKind_NULL = 0, -RDI_NameMapKind_GlobalVariables = 1, -RDI_NameMapKind_ThreadVariables = 2, -RDI_NameMapKind_Constants = 3, -RDI_NameMapKind_Procedures = 4, -RDI_NameMapKind_Types = 5, -RDI_NameMapKind_LinkNameProcedures = 6, -RDI_NameMapKind_NormalSourcePaths = 7, -RDI_NameMapKind_COUNT = 8, -} RDI_NameMapKindEnum; - -#define RDI_Header_XList \ -X(RDI_U64, magic)\ -X(RDI_U32, encoding_version)\ -X(RDI_U32, data_section_off)\ -X(RDI_U32, data_section_count)\ - -#define RDI_SectionKind_XList \ -X(NULL, null, RDI_U8)\ -X(TopLevelInfo, top_level_info, RDI_TopLevelInfo)\ -X(StringData, string_data, RDI_U8)\ -X(StringTable, string_table, RDI_U32)\ -X(IndexRuns, index_runs, RDI_U32)\ -X(BinarySections, binary_sections, RDI_BinarySection)\ -X(FilePathNodes, file_path_nodes, RDI_FilePathNode)\ -X(SourceFiles, source_files, RDI_SourceFile)\ -X(LineTables, line_tables, RDI_LineTable)\ -X(LineInfoVOffs, line_info_voffs, RDI_U64)\ -X(LineInfoLines, line_info_lines, RDI_Line)\ -X(LineInfoColumns, line_info_columns, RDI_Column)\ -X(SourceLineMaps, source_line_maps, RDI_SourceLineMap)\ -X(SourceLineMapNumbers, source_line_map_numbers, RDI_U32)\ -X(SourceLineMapRanges, source_line_map_ranges, RDI_U32)\ -X(SourceLineMapVOffs, source_line_map_voffs, RDI_U64)\ -X(Units, units, RDI_Unit)\ -X(UnitVMap, unit_vmap, RDI_VMapEntry)\ -X(TypeNodes, type_nodes, RDI_TypeNode)\ -X(UDTs, udts, RDI_UDT)\ -X(Members, members, RDI_Member)\ -X(EnumMembers, enum_members, RDI_EnumMember)\ -X(GlobalVariables, global_variables, RDI_GlobalVariable)\ -X(GlobalVMap, global_vmap, RDI_VMapEntry)\ -X(ThreadVariables, thread_variables, RDI_ThreadVariable)\ -X(Constants, constants, RDI_Constant)\ -X(Procedures, procedures, RDI_Procedure)\ -X(Scopes, scopes, RDI_Scope)\ -X(ScopeVOffData, scope_voff_data, RDI_U64)\ -X(ScopeVMap, scope_vmap, RDI_VMapEntry)\ -X(InlineSites, inline_sites, RDI_InlineSite)\ -X(Locals, locals, RDI_Local)\ -X(LocationBlocks, location_blocks, RDI_LocationBlock)\ -X(LocationData, location_data, RDI_U8)\ -X(ConstantValueData, constant_value_data, RDI_U8)\ -X(ConstantValueTable, constant_value_table, RDI_U32)\ -X(NameMaps, name_maps, RDI_NameMap)\ -X(NameMapBuckets, name_map_buckets, RDI_NameMapBucket)\ -X(NameMapNodes, name_map_nodes, RDI_NameMapNode)\ - -#define RDI_SectionEncoding_XList \ -X(Unpacked)\ -X(LZB)\ - -#define RDI_Section_XList \ -X(RDI_SectionEncoding, encoding)\ -X(RDI_U32, pad)\ -X(RDI_U64, off)\ -X(RDI_U64, encoded_size)\ -X(RDI_U64, unpacked_size)\ - -#define RDI_VMapEntry_XList \ -X(RDI_U64, voff)\ -X(RDI_U64, idx)\ - -#define RDI_Arch_XList \ -X(NULL)\ -X(X86)\ -X(X64)\ - -#define RDI_RegCodeX86_XList \ -X(nil, 0)\ -X(eax, 1)\ -X(ecx, 2)\ -X(edx, 3)\ -X(ebx, 4)\ -X(esp, 5)\ -X(ebp, 6)\ -X(esi, 7)\ -X(edi, 8)\ -X(fsbase, 9)\ -X(gsbase, 10)\ -X(eflags, 11)\ -X(eip, 12)\ -X(dr0, 13)\ -X(dr1, 14)\ -X(dr2, 15)\ -X(dr3, 16)\ -X(dr4, 17)\ -X(dr5, 18)\ -X(dr6, 19)\ -X(dr7, 20)\ -X(fpr0, 21)\ -X(fpr1, 22)\ -X(fpr2, 23)\ -X(fpr3, 24)\ -X(fpr4, 25)\ -X(fpr5, 26)\ -X(fpr6, 27)\ -X(fpr7, 28)\ -X(st0, 29)\ -X(st1, 30)\ -X(st2, 31)\ -X(st3, 32)\ -X(st4, 33)\ -X(st5, 34)\ -X(st6, 35)\ -X(st7, 36)\ -X(fcw, 37)\ -X(fsw, 38)\ -X(ftw, 39)\ -X(fop, 40)\ -X(fcs, 41)\ -X(fds, 42)\ -X(fip, 43)\ -X(fdp, 44)\ -X(mxcsr, 45)\ -X(mxcsr_mask, 46)\ -X(ss, 47)\ -X(cs, 48)\ -X(ds, 49)\ -X(es, 50)\ -X(fs, 51)\ -X(gs, 52)\ -X(ymm0, 53)\ -X(ymm1, 54)\ -X(ymm2, 55)\ -X(ymm3, 56)\ -X(ymm4, 57)\ -X(ymm5, 58)\ -X(ymm6, 59)\ -X(ymm7, 60)\ - -#define RDI_RegCodeX64_XList \ -X(nil, 0)\ -X(rax, 1)\ -X(rcx, 2)\ -X(rdx, 3)\ -X(rbx, 4)\ -X(rsp, 5)\ -X(rbp, 6)\ -X(rsi, 7)\ -X(rdi, 8)\ -X(r8, 9)\ -X(r9, 10)\ -X(r10, 11)\ -X(r11, 12)\ -X(r12, 13)\ -X(r13, 14)\ -X(r14, 15)\ -X(r15, 16)\ -X(es, 17)\ -X(cs, 18)\ -X(ss, 19)\ -X(ds, 20)\ -X(fs, 21)\ -X(gs, 22)\ -X(rip, 23)\ -X(rflags, 24)\ -X(dr0, 25)\ -X(dr1, 26)\ -X(dr2, 27)\ -X(dr3, 28)\ -X(dr4, 29)\ -X(dr5, 30)\ -X(dr6, 31)\ -X(dr7, 32)\ -X(st0, 33)\ -X(st1, 34)\ -X(st2, 35)\ -X(st3, 36)\ -X(st4, 37)\ -X(st5, 38)\ -X(st6, 39)\ -X(st7, 40)\ -X(fpr0, 41)\ -X(fpr1, 42)\ -X(fpr2, 43)\ -X(fpr3, 44)\ -X(fpr4, 45)\ -X(fpr5, 46)\ -X(fpr6, 47)\ -X(fpr7, 48)\ -X(zmm0, 49)\ -X(zmm1, 50)\ -X(zmm2, 51)\ -X(zmm3, 52)\ -X(zmm4, 53)\ -X(zmm5, 54)\ -X(zmm6, 55)\ -X(zmm7, 56)\ -X(zmm8, 57)\ -X(zmm9, 58)\ -X(zmm10, 59)\ -X(zmm11, 60)\ -X(zmm12, 61)\ -X(zmm13, 62)\ -X(zmm14, 63)\ -X(zmm15, 64)\ -X(zmm16, 65)\ -X(zmm17, 66)\ -X(zmm18, 67)\ -X(zmm19, 68)\ -X(zmm20, 69)\ -X(zmm21, 70)\ -X(zmm22, 71)\ -X(zmm23, 72)\ -X(zmm24, 73)\ -X(zmm25, 74)\ -X(zmm26, 75)\ -X(zmm27, 76)\ -X(zmm28, 77)\ -X(zmm29, 78)\ -X(zmm30, 79)\ -X(zmm31, 80)\ -X(k0, 81)\ -X(k1, 82)\ -X(k2, 83)\ -X(k3, 84)\ -X(k4, 85)\ -X(k5, 86)\ -X(k6, 87)\ -X(k7, 88)\ -X(mxcsr, 89)\ -X(fsbase, 90)\ -X(gsbase, 91)\ -X(fcw, 92)\ -X(fsw, 93)\ -X(ftw, 94)\ -X(fop, 95)\ -X(fcs, 96)\ -X(fds, 97)\ -X(fip, 98)\ -X(fdp, 99)\ -X(mxcsr_mask, 100)\ - -#define RDI_TopLevelInfo_XList \ -X(RDI_Arch, arch)\ -X(RDI_U32, exe_name_string_idx)\ -X(RDI_U64, exe_hash)\ -X(RDI_U64, voff_max)\ -X(RDI_U32, producer_name_string_idx)\ - -#define RDI_BinarySectionFlags_XList \ -X(Read)\ -X(Write)\ -X(Execute)\ - -#define RDI_BinarySection_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_BinarySectionFlags, flags)\ -X(RDI_U64, voff_first)\ -X(RDI_U64, voff_opl)\ -X(RDI_U64, foff_first)\ -X(RDI_U64, foff_opl)\ - -#define RDI_FilePathNode_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, parent_path_node)\ -X(RDI_U32, first_child)\ -X(RDI_U32, next_sibling)\ -X(RDI_U32, source_file_idx)\ - -#define RDI_SourceFile_XList \ -X(RDI_U32, file_path_node_idx)\ -X(RDI_U32, normal_full_path_string_idx)\ -X(RDI_U32, source_line_map_idx)\ - -#define RDI_Unit_XList \ -X(RDI_U32, unit_name_string_idx)\ -X(RDI_U32, compiler_name_string_idx)\ -X(RDI_U32, source_file_path_node)\ -X(RDI_U32, object_file_path_node)\ -X(RDI_U32, archive_file_path_node)\ -X(RDI_U32, build_path_node)\ -X(RDI_Language, language)\ -X(RDI_U32, line_table_idx)\ - -#define RDI_LineTable_XList \ -X(RDI_U32, voffs_base_idx)\ -X(RDI_U32, lines_base_idx)\ -X(RDI_U32, cols_base_idx)\ -X(RDI_U32, lines_count)\ -X(RDI_U32, cols_count)\ - -#define RDI_Line_XList \ -X(RDI_U32, file_idx)\ -X(RDI_U32, line_num)\ - -#define RDI_Column_XList \ -X(RDI_U16, col_first)\ -X(RDI_U16, col_opl)\ - -#define RDI_SourceLineMapMemberTable \ -X(RDI_U32, line_count)\ -X(RDI_U32, voff_count)\ -X(RDI_U32, line_map_nums_base_idx)\ -X(RDI_U32, line_map_range_base_idx)\ -X(RDI_U32, line_map_voff_base_idx)\ - -#define RDI_Language_XList \ -X(NULL)\ -X(C)\ -X(CPlusPlus)\ -X(Masm)\ -X(COUNT)\ - -#define RDI_TypeKind_XList \ -X(NULL)\ -X(Void)\ -X(Handle)\ -X(HResult)\ -X(Char8)\ -X(Char16)\ -X(Char32)\ -X(UChar8)\ -X(UChar16)\ -X(UChar32)\ -X(U8)\ -X(U16)\ -X(U32)\ -X(U64)\ -X(U128)\ -X(U256)\ -X(U512)\ -X(S8)\ -X(S16)\ -X(S32)\ -X(S64)\ -X(S128)\ -X(S256)\ -X(S512)\ -X(Bool)\ -X(F16)\ -X(F32)\ -X(F32PP)\ -X(F48)\ -X(F64)\ -X(F80)\ -X(F128)\ -X(ComplexF32)\ -X(ComplexF64)\ -X(ComplexF80)\ -X(ComplexF128)\ -X(Modifier)\ -X(Ptr)\ -X(LRef)\ -X(RRef)\ -X(Array)\ -X(Function)\ -X(Method)\ -X(MemberPtr)\ -X(Struct)\ -X(Class)\ -X(Union)\ -X(Enum)\ -X(Alias)\ -X(IncompleteStruct)\ -X(IncompleteUnion)\ -X(IncompleteClass)\ -X(IncompleteEnum)\ -X(Bitfield)\ -X(Variadic)\ -X(Count)\ - -#define RDI_TypeModifierFlags_XList \ -X(Const)\ -X(Volatile)\ -X(Restrict)\ - -#define RDI_TypeNode_XList \ -X(RDI_TypeKind, kind)\ -X(RDI_U16, flags)\ -X(RDI_U32, byte_size)\ - -#define RDI_UDTFlags_XList \ -X(EnumMembers)\ - -#define RDI_UDT_XList \ -X(RDI_U32, self_type_idx)\ -X(RDI_UDTFlags, flags)\ -X(RDI_U32, member_first)\ -X(RDI_U32, member_count)\ -X(RDI_U32, file_idx)\ -X(RDI_U32, line)\ -X(RDI_U32, col)\ - -#define RDI_MemberKind_XList \ -X(NULL)\ -X(DataField)\ -X(StaticData)\ -X(Method)\ -X(StaticMethod)\ -X(VirtualMethod)\ -X(VTablePtr)\ -X(Base)\ -X(VirtualBase)\ -X(NestedType)\ - -#define RDI_Member_XList \ -X(RDI_MemberKind, kind)\ -X(RDI_U16, pad)\ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, off)\ - -#define RDI_EnumMember_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, pad)\ -X(RDI_U64, val)\ - -#define RDI_LinkFlags_XList \ -X(External)\ -X(TypeScoped)\ -X(ProcScoped)\ - -#define RDI_LocalKind_XList \ -X(NULL)\ -X(Parameter)\ -X(Variable)\ - -#define RDI_LocationKind_XList \ -X(NULL)\ -X(AddrBytecodeStream)\ -X(ValBytecodeStream)\ -X(AddrRegPlusU16)\ -X(AddrAddrRegPlusU16)\ -X(ValReg)\ - -#define RDI_GlobalVariable_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_LinkFlags, link_flags)\ -X(RDI_U64, voff)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, container_idx)\ - -#define RDI_ThreadVariable_XList \ -X(type, name_string_idx)\ -X(type, link_flags)\ -X(type, tls_off)\ -X(type, type_idx)\ -X(type, container_idx)\ - -#define RDI_Procedure_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, link_name_string_idx)\ -X(RDI_LinkFlags, link_flags)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, root_scope_idx)\ -X(RDI_U32, container_idx)\ -X(RDI_U32, frame_base_location_first)\ -X(RDI_U32, frame_base_location_opl)\ - -#define RDI_Scope_XList \ -X(RDI_U32, proc_idx)\ -X(RDI_U32, parent_scope_idx)\ -X(RDI_U32, first_child_scope_idx)\ -X(RDI_U32, next_sibling_scope_idx)\ -X(RDI_U32, voff_range_first)\ -X(RDI_U32, voff_range_opl)\ -X(RDI_U32, local_first)\ -X(RDI_U32, local_count)\ -X(RDI_U32, static_local_idx_run_first)\ -X(RDI_U32, static_local_count)\ -X(RDI_U32, inline_site_idx)\ - -#define RDI_InlineSite_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, owner_type_idx)\ -X(RDI_U32, line_table_idx)\ - -#define RDI_Local_XList \ -X(RDI_LocalKind, kind)\ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, pad)\ -X(RDI_U32, location_first)\ -X(RDI_U32, location_opl)\ - -#define RDI_LocationBlock_XList \ -X(RDI_U32, scope_off_first)\ -X(RDI_U32, scope_off_opl)\ -X(RDI_U32, location_data_off)\ - -#define RDI_LocationBytecodeStream_XList \ -X(RDI_LocationKind, kind)\ - -#define RDI_LocationRegPlusU16_XList \ -X(RDI_LocationKind, kind)\ -X(RDI_RegCode, reg_code)\ -X(RDI_U16, offset)\ - -#define RDI_LocationReg_XList \ -X(RDI_LocationKind, kind)\ -X(RDI_RegCode, reg_code)\ - -#define RDI_EvalOp_XList \ -X(Stop)\ -X(Noop)\ -X(Cond)\ -X(Skip)\ -X(MemRead)\ -X(RegRead)\ -X(RegReadDyn)\ -X(FrameOff)\ -X(ModuleOff)\ -X(TLSOff)\ -X(ObjectOff)\ -X(CFA)\ -X(ConstU8)\ -X(ConstU16)\ -X(ConstU32)\ -X(ConstU64)\ -X(ConstU128)\ -X(ConstString)\ -X(Abs)\ -X(Neg)\ -X(Add)\ -X(Sub)\ -X(Mul)\ -X(Div)\ -X(Mod)\ -X(LShift)\ -X(RShift)\ -X(BitAnd)\ -X(BitOr)\ -X(BitXor)\ -X(BitNot)\ -X(LogAnd)\ -X(LogOr)\ -X(LogNot)\ -X(EqEq)\ -X(NtEq)\ -X(LsEq)\ -X(GrEq)\ -X(Less)\ -X(Grtr)\ -X(Trunc)\ -X(TruncSigned)\ -X(Convert)\ -X(Pick)\ -X(Pop)\ -X(Insert)\ -X(ValueRead)\ -X(ByteSwap)\ -X(CallSiteValue)\ -X(PartialValue)\ -X(PartialValueBit)\ - -#define RDI_EvalTypeGroup_XList \ -X(Other)\ -X(U)\ -X(S)\ -X(F32)\ -X(F64)\ - -#define RDI_EvalConversionKind_XList \ -X(Noop)\ -X(Legal)\ -X(OtherToOther)\ -X(ToOther)\ -X(FromOther)\ - -#define RDI_NameMapKind_XList \ -X(NULL)\ -X(GlobalVariables)\ -X(ThreadVariables)\ -X(Constants)\ -X(Procedures)\ -X(Types)\ -X(LinkNameProcedures)\ -X(NormalSourcePaths)\ - -#define RDI_NameMap_XList \ -X(RDI_U32, bucket_base_idx)\ -X(RDI_U32, node_base_idx)\ -X(RDI_U32, bucket_count)\ -X(RDI_U32, node_count)\ - -#define RDI_NameMapBucket_XList \ -X(RDI_U32, first_node)\ -X(RDI_U32, node_count)\ - -#define RDI_NameMapNode_XList \ -X(RDI_U32, string_idx)\ -X(RDI_U32, match_count)\ -X(RDI_U32, match_idx_or_idx_run_first)\ - -#if !RDI_DISABLE_TABLE_INDEX_TYPECHECKING -typedef struct RDI_U32_StringTable { RDI_U32 v; } RDI_U32_StringTable; -typedef struct RDI_U32_IndexRuns { RDI_U32 v; } RDI_U32_IndexRuns; -typedef struct RDI_U32_BinarySections { RDI_U32 v; } RDI_U32_BinarySections; -typedef struct RDI_U32_FilePathNodes { RDI_U32 v; } RDI_U32_FilePathNodes; -typedef struct RDI_U32_SourceFiles { RDI_U32 v; } RDI_U32_SourceFiles; -typedef struct RDI_U32_LineTables { RDI_U32 v; } RDI_U32_LineTables; -typedef struct RDI_U32_LineInfoVOffs { RDI_U32 v; } RDI_U32_LineInfoVOffs; -typedef struct RDI_U32_LineInfoLines { RDI_U32 v; } RDI_U32_LineInfoLines; -typedef struct RDI_U32_LineInfoColumns { RDI_U32 v; } RDI_U32_LineInfoColumns; -typedef struct RDI_U32_SourceLineMaps { RDI_U32 v; } RDI_U32_SourceLineMaps; -typedef struct RDI_U32_SourceLineMapNumbers { RDI_U32 v; } RDI_U32_SourceLineMapNumbers; -typedef struct RDI_U32_SourceLineMapRanges { RDI_U32 v; } RDI_U32_SourceLineMapRanges; -typedef struct RDI_U32_SourceLineMapVOffs { RDI_U32 v; } RDI_U32_SourceLineMapVOffs; -typedef struct RDI_U32_Units { RDI_U32 v; } RDI_U32_Units; -typedef struct RDI_U32_TypeNodes { RDI_U32 v; } RDI_U32_TypeNodes; -typedef struct RDI_U32_UDTs { RDI_U32 v; } RDI_U32_UDTs; -typedef struct RDI_U32_Members { RDI_U32 v; } RDI_U32_Members; -typedef struct RDI_U32_EnumMembers { RDI_U32 v; } RDI_U32_EnumMembers; -typedef struct RDI_U32_GlobalVariables { RDI_U32 v; } RDI_U32_GlobalVariables; -typedef struct RDI_U32_ThreadVariables { RDI_U32 v; } RDI_U32_ThreadVariables; -typedef struct RDI_U32_Constants { RDI_U32 v; } RDI_U32_Constants; -typedef struct RDI_U32_Procedures { RDI_U32 v; } RDI_U32_Procedures; -typedef struct RDI_U32_Scopes { RDI_U32 v; } RDI_U32_Scopes; -typedef struct RDI_U32_ScopeVOffData { RDI_U32 v; } RDI_U32_ScopeVOffData; -typedef struct RDI_U32_InlineSites { RDI_U32 v; } RDI_U32_InlineSites; -typedef struct RDI_U32_Locals { RDI_U32 v; } RDI_U32_Locals; -typedef struct RDI_U32_LocationBlocks { RDI_U32 v; } RDI_U32_LocationBlocks; -typedef struct RDI_U32_LocationData { RDI_U32 v; } RDI_U32_LocationData; -typedef struct RDI_U32_ConstantValueData { RDI_U32 v; } RDI_U32_ConstantValueData; -typedef struct RDI_U32_ConstantValueTable { RDI_U32 v; } RDI_U32_ConstantValueTable; -typedef struct RDI_U32_NameMaps { RDI_U32 v; } RDI_U32_NameMaps; -typedef struct RDI_U32_NameMapBuckets { RDI_U32 v; } RDI_U32_NameMapBuckets; -typedef struct RDI_U32_NameMapNodes { RDI_U32 v; } RDI_U32_NameMapNodes; -#else -typedef struct RDI_U32_Table { RDI_U32 v; } RDI_U32_Table; -typedef struct RDI_U64_Table { RDI_U64 v; } RDI_U64_Table; -typedef RDI_U32_Table RDI_U32_StringTable; -typedef RDI_U32_Table RDI_U32_IndexRuns; -typedef RDI_U32_Table RDI_U32_BinarySections; -typedef RDI_U32_Table RDI_U32_FilePathNodes; -typedef RDI_U32_Table RDI_U32_SourceFiles; -typedef RDI_U32_Table RDI_U32_LineTables; -typedef RDI_U32_Table RDI_U32_LineInfoVOffs; -typedef RDI_U32_Table RDI_U32_LineInfoLines; -typedef RDI_U32_Table RDI_U32_LineInfoColumns; -typedef RDI_U32_Table RDI_U32_SourceLineMaps; -typedef RDI_U32_Table RDI_U32_SourceLineMapNumbers; -typedef RDI_U32_Table RDI_U32_SourceLineMapRanges; -typedef RDI_U32_Table RDI_U32_SourceLineMapVOffs; -typedef RDI_U32_Table RDI_U32_Units; -typedef RDI_U32_Table RDI_U32_TypeNodes; -typedef RDI_U32_Table RDI_U32_UDTs; -typedef RDI_U32_Table RDI_U32_Members; -typedef RDI_U32_Table RDI_U32_EnumMembers; -typedef RDI_U32_Table RDI_U32_GlobalVariables; -typedef RDI_U32_Table RDI_U32_ThreadVariables; -typedef RDI_U32_Table RDI_U32_Constants; -typedef RDI_U32_Table RDI_U32_Procedures; -typedef RDI_U32_Table RDI_U32_Scopes; -typedef RDI_U32_Table RDI_U32_ScopeVOffData; -typedef RDI_U32_Table RDI_U32_InlineSites; -typedef RDI_U32_Table RDI_U32_Locals; -typedef RDI_U32_Table RDI_U32_LocationBlocks; -typedef RDI_U32_Table RDI_U32_LocationData; -typedef RDI_U32_Table RDI_U32_ConstantValueData; -typedef RDI_U32_Table RDI_U32_ConstantValueTable; -typedef RDI_U32_Table RDI_U32_NameMaps; -typedef RDI_U32_Table RDI_U32_NameMapBuckets; -typedef RDI_U32_Table RDI_U32_NameMapNodes; -#endif - -#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) (((decodeN) << 8) | ((popN) << 4) | ((pushN) << 0)) -#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 8) & 0xff) -#define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0xf) -#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 0) & 0xf) -#define RDI_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16)) - -typedef struct RDI_Header RDI_Header; -struct RDI_Header -{ -RDI_U64 magic; -RDI_U32 encoding_version; -RDI_U32 data_section_off; -RDI_U32 data_section_count; -}; - -typedef struct RDI_Section RDI_Section; -struct RDI_Section -{ -RDI_SectionEncoding encoding; -RDI_U32 pad; -RDI_U64 off; -RDI_U64 encoded_size; -RDI_U64 unpacked_size; -}; - -typedef struct RDI_VMapEntry RDI_VMapEntry; -struct RDI_VMapEntry -{ -RDI_U64 voff; -RDI_U64 idx; -}; - -typedef struct RDI_TopLevelInfo RDI_TopLevelInfo; -struct RDI_TopLevelInfo -{ -RDI_Arch arch; -RDI_U32 exe_name_string_idx; -RDI_U64 exe_hash; -RDI_U64 voff_max; -RDI_U32 producer_name_string_idx; -}; - -typedef struct RDI_BinarySection RDI_BinarySection; -struct RDI_BinarySection -{ -RDI_U32 name_string_idx; -RDI_BinarySectionFlags flags; -RDI_U64 voff_first; -RDI_U64 voff_opl; -RDI_U64 foff_first; -RDI_U64 foff_opl; -}; - -typedef struct RDI_FilePathNode RDI_FilePathNode; -struct RDI_FilePathNode -{ -RDI_U32 name_string_idx; -RDI_U32 parent_path_node; -RDI_U32 first_child; -RDI_U32 next_sibling; -RDI_U32 source_file_idx; -}; - -typedef struct RDI_SourceFile RDI_SourceFile; -struct RDI_SourceFile -{ -RDI_U32 file_path_node_idx; -RDI_U32 normal_full_path_string_idx; -RDI_U32 source_line_map_idx; -}; - -typedef struct RDI_Unit RDI_Unit; -struct RDI_Unit -{ -RDI_U32 unit_name_string_idx; -RDI_U32 compiler_name_string_idx; -RDI_U32 source_file_path_node; -RDI_U32 object_file_path_node; -RDI_U32 archive_file_path_node; -RDI_U32 build_path_node; -RDI_Language language; -RDI_U32 line_table_idx; -}; - -typedef struct RDI_LineTable RDI_LineTable; -struct RDI_LineTable -{ -RDI_U32 voffs_base_idx; -RDI_U32 lines_base_idx; -RDI_U32 cols_base_idx; -RDI_U32 lines_count; -RDI_U32 cols_count; -}; - -typedef struct RDI_Line RDI_Line; -struct RDI_Line -{ -RDI_U32 file_idx; -RDI_U32 line_num; -}; - -typedef struct RDI_Column RDI_Column; -struct RDI_Column -{ -RDI_U16 col_first; -RDI_U16 col_opl; -}; - -typedef struct RDI_SourceLineMap RDI_SourceLineMap; -struct RDI_SourceLineMap -{ -RDI_U32 line_count; -RDI_U32 voff_count; -RDI_U32 line_map_nums_base_idx; -RDI_U32 line_map_range_base_idx; -RDI_U32 line_map_voff_base_idx; -}; - -typedef struct RDI_TypeNode RDI_TypeNode; -struct RDI_TypeNode -{ -RDI_TypeKind kind; -RDI_U16 flags; -RDI_U32 byte_size; - - union - { - // kind is 'built-in' - struct - { - RDI_U32 name_string_idx; - } built_in; - - // kind is 'constructed' - struct - { - RDI_U32 direct_type_idx; - RDI_U32 count; - union - { - // when kind is 'Function' or 'Method' - RDI_U32 param_idx_run_first; - // when kind is 'MemberPtr' - RDI_U32 owner_type_idx; - }; - } - constructed; - - // kind is 'user defined' - struct - { - RDI_U32 name_string_idx; - RDI_U32 direct_type_idx; - RDI_U32 udt_idx; - } - user_defined; - - // (kind = Bitfield) - struct - { - RDI_U32 direct_type_idx; - RDI_U32 off; - RDI_U32 size; - } - bitfield; - } - ; -}; - -typedef struct RDI_UDT RDI_UDT; -struct RDI_UDT -{ -RDI_U32 self_type_idx; -RDI_UDTFlags flags; -RDI_U32 member_first; -RDI_U32 member_count; -RDI_U32 file_idx; -RDI_U32 line; -RDI_U32 col; -}; - -typedef struct RDI_Member RDI_Member; -struct RDI_Member -{ -RDI_MemberKind kind; -RDI_U16 pad; -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 off; -}; - -typedef struct RDI_EnumMember RDI_EnumMember; -struct RDI_EnumMember -{ -RDI_U32 name_string_idx; -RDI_U32 pad; -RDI_U64 val; -}; - -typedef struct RDI_GlobalVariable RDI_GlobalVariable; -struct RDI_GlobalVariable -{ -RDI_U32 name_string_idx; -RDI_LinkFlags link_flags; -RDI_U64 voff; -RDI_U32 type_idx; -RDI_U32 container_idx; -}; - -typedef struct RDI_ThreadVariable RDI_ThreadVariable; -struct RDI_ThreadVariable -{ -RDI_U32 name_string_idx; -RDI_LinkFlags link_flags; -RDI_U32 tls_off; -RDI_U32 type_idx; -RDI_U32 container_idx; -}; - -typedef struct RDI_Constant RDI_Constant; -struct RDI_Constant -{ -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 constant_value_idx; -}; - -typedef struct RDI_Procedure RDI_Procedure; -struct RDI_Procedure -{ -RDI_U32 name_string_idx; -RDI_U32 link_name_string_idx; -RDI_LinkFlags link_flags; -RDI_U32 type_idx; -RDI_U32 root_scope_idx; -RDI_U32 container_idx; -RDI_U32 frame_base_location_first; -RDI_U32 frame_base_location_opl; -}; - -typedef struct RDI_Scope RDI_Scope; -struct RDI_Scope -{ -RDI_U32 proc_idx; -RDI_U32 parent_scope_idx; -RDI_U32 first_child_scope_idx; -RDI_U32 next_sibling_scope_idx; -RDI_U32 voff_range_first; -RDI_U32 voff_range_opl; -RDI_U32 local_first; -RDI_U32 local_count; -RDI_U32 static_local_idx_run_first; -RDI_U32 static_local_count; -RDI_U32 inline_site_idx; -}; - -typedef struct RDI_InlineSite RDI_InlineSite; -struct RDI_InlineSite -{ -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 owner_type_idx; -RDI_U32 line_table_idx; -}; - -typedef struct RDI_Local RDI_Local; -struct RDI_Local -{ -RDI_LocalKind kind; -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 pad; -RDI_U32 location_first; -RDI_U32 location_opl; -}; - -typedef struct RDI_LocationBlock RDI_LocationBlock; -struct RDI_LocationBlock -{ -RDI_U32 scope_off_first; -RDI_U32 scope_off_opl; -RDI_U32 location_data_off; -}; - -typedef struct RDI_LocationBytecodeStream RDI_LocationBytecodeStream; -struct RDI_LocationBytecodeStream -{ -RDI_LocationKind kind; -}; - -typedef struct RDI_LocationRegPlusU16 RDI_LocationRegPlusU16; -struct RDI_LocationRegPlusU16 -{ -RDI_LocationKind kind; -RDI_RegCode reg_code; -RDI_U16 offset; -}; - -typedef struct RDI_LocationReg RDI_LocationReg; -struct RDI_LocationReg -{ -RDI_LocationKind kind; -RDI_RegCode reg_code; -}; - -typedef struct RDI_NameMap RDI_NameMap; -struct RDI_NameMap -{ -RDI_U32 bucket_base_idx; -RDI_U32 node_base_idx; -RDI_U32 bucket_count; -RDI_U32 node_count; -}; - -typedef struct RDI_NameMapBucket RDI_NameMapBucket; -struct RDI_NameMapBucket -{ -RDI_U32 first_node; -RDI_U32 node_count; -}; - -typedef struct RDI_NameMapNode RDI_NameMapNode; -struct RDI_NameMapNode -{ -RDI_U32 string_idx; -RDI_U32 match_count; -RDI_U32 match_idx_or_idx_run_first; -}; - -typedef RDI_TopLevelInfo RDI_SectionElementType_TopLevelInfo; -typedef RDI_U8 RDI_SectionElementType_StringData; -typedef RDI_U32 RDI_SectionElementType_StringTable; -typedef RDI_U32 RDI_SectionElementType_IndexRuns; -typedef RDI_BinarySection RDI_SectionElementType_BinarySections; -typedef RDI_FilePathNode RDI_SectionElementType_FilePathNodes; -typedef RDI_SourceFile RDI_SectionElementType_SourceFiles; -typedef RDI_LineTable RDI_SectionElementType_LineTables; -typedef RDI_U64 RDI_SectionElementType_LineInfoVOffs; -typedef RDI_Line RDI_SectionElementType_LineInfoLines; -typedef RDI_Column RDI_SectionElementType_LineInfoColumns; -typedef RDI_SourceLineMap RDI_SectionElementType_SourceLineMaps; -typedef RDI_U32 RDI_SectionElementType_SourceLineMapNumbers; -typedef RDI_U32 RDI_SectionElementType_SourceLineMapRanges; -typedef RDI_U64 RDI_SectionElementType_SourceLineMapVOffs; -typedef RDI_Unit RDI_SectionElementType_Units; -typedef RDI_VMapEntry RDI_SectionElementType_UnitVMap; -typedef RDI_TypeNode RDI_SectionElementType_TypeNodes; -typedef RDI_UDT RDI_SectionElementType_UDTs; -typedef RDI_Member RDI_SectionElementType_Members; -typedef RDI_EnumMember RDI_SectionElementType_EnumMembers; -typedef RDI_GlobalVariable RDI_SectionElementType_GlobalVariables; -typedef RDI_VMapEntry RDI_SectionElementType_GlobalVMap; -typedef RDI_ThreadVariable RDI_SectionElementType_ThreadVariables; -typedef RDI_Constant RDI_SectionElementType_Constants; -typedef RDI_Procedure RDI_SectionElementType_Procedures; -typedef RDI_Scope RDI_SectionElementType_Scopes; -typedef RDI_U64 RDI_SectionElementType_ScopeVOffData; -typedef RDI_VMapEntry RDI_SectionElementType_ScopeVMap; -typedef RDI_InlineSite RDI_SectionElementType_InlineSites; -typedef RDI_Local RDI_SectionElementType_Locals; -typedef RDI_LocationBlock RDI_SectionElementType_LocationBlocks; -typedef RDI_U8 RDI_SectionElementType_LocationData; -typedef RDI_U8 RDI_SectionElementType_ConstantValueData; -typedef RDI_U32 RDI_SectionElementType_ConstantValueTable; -typedef RDI_NameMap RDI_SectionElementType_NameMaps; -typedef RDI_NameMapBucket RDI_SectionElementType_NameMapBuckets; -typedef RDI_NameMapNode RDI_SectionElementType_NameMapNodes; - -RDI_PROC RDI_U64 rdi_hash(RDI_U8 *ptr, RDI_U64 size); -RDI_PROC RDI_U8 *rdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out); -RDI_PROC RDI_U32 rdi_size_from_basic_type_kind(RDI_TypeKind kind); -RDI_PROC RDI_U32 rdi_addr_size_from_arch(RDI_Arch arch); -RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out); -RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group); -RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); - -extern RDI_U16 rdi_section_element_size_table[40]; -extern RDI_U8 rdi_section_is_required_table[40]; -extern RDI_U16 rdi_eval_op_ctrlbits_table[52]; - -#endif // RDI_FORMAT_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////////////////////////////////////// +//~ (R)AD (D)ebug (I)nfo Format Library +// +// Defines standard RDI debug information format types and +// functions. + +#ifndef RDI_H +#define RDI_H + +//////////////////////////////////////////////////////////////// +//~ Overridable Procedure Decoration + +#if !defined(RDI_PROC) +# define RDI_PROC static +#endif + +//////////////////////////////////////////////////////////////// +//~ Overridable Basic Integer Types + +#if !defined(RDI_U8) +# define RDI_U8 RDI_U8 +# define RDI_U16 RDI_U16 +# define RDI_U32 RDI_U32 +# define RDI_U64 RDI_U64 +# define RDI_S8 RDI_S8 +# define RDI_S16 RDI_S16 +# define RDI_S32 RDI_S32 +# define RDI_S64 RDI_S64 +#include +typedef uint8_t RDI_U8; +typedef uint16_t RDI_U16; +typedef uint32_t RDI_U32; +typedef uint64_t RDI_U64; +typedef int8_t RDI_S8; +typedef int16_t RDI_S16; +typedef int32_t RDI_S32; +typedef int64_t RDI_S64; +#endif + +//////////////////////////////////////////////////////////////// +//~ Overridable Enabling/Disabling Of Table Index Typechecking + +#if !defined(RDI_DISABLE_TABLE_INDEX_TYPECHECKING) +# define RDI_DISABLE_TABLE_INDEX_TYPECHECKING 0 +#endif + +//////////////////////////////////////////////////////////////// +//~ Format Constants + +// "raddbg\0\0" +#define RDI_MAGIC_CONSTANT 0x0000676264646172 +#define RDI_ENCODING_VERSION 12 + +//////////////////////////////////////////////////////////////// +//~ Format Types & Functions + +typedef RDI_U32 RDI_SectionKind; +typedef enum RDI_SectionKindEnum +{ +RDI_SectionKind_NULL = 0x0000, +RDI_SectionKind_TopLevelInfo = 0x0001, +RDI_SectionKind_StringData = 0x0002, +RDI_SectionKind_StringTable = 0x0003, +RDI_SectionKind_IndexRuns = 0x0004, +RDI_SectionKind_BinarySections = 0x0005, +RDI_SectionKind_FilePathNodes = 0x0006, +RDI_SectionKind_SourceFiles = 0x0007, +RDI_SectionKind_LineTables = 0x0008, +RDI_SectionKind_LineInfoVOffs = 0x0009, +RDI_SectionKind_LineInfoLines = 0x000A, +RDI_SectionKind_LineInfoColumns = 0x000B, +RDI_SectionKind_SourceLineMaps = 0x000C, +RDI_SectionKind_SourceLineMapNumbers = 0x000D, +RDI_SectionKind_SourceLineMapRanges = 0x000E, +RDI_SectionKind_SourceLineMapVOffs = 0x000F, +RDI_SectionKind_Units = 0x0010, +RDI_SectionKind_UnitVMap = 0x0011, +RDI_SectionKind_TypeNodes = 0x0012, +RDI_SectionKind_UDTs = 0x0013, +RDI_SectionKind_Members = 0x0014, +RDI_SectionKind_EnumMembers = 0x0015, +RDI_SectionKind_GlobalVariables = 0x0016, +RDI_SectionKind_GlobalVMap = 0x0017, +RDI_SectionKind_ThreadVariables = 0x0018, +RDI_SectionKind_Constants = 0x0019, +RDI_SectionKind_Procedures = 0x001A, +RDI_SectionKind_Scopes = 0x001B, +RDI_SectionKind_ScopeVOffData = 0x001C, +RDI_SectionKind_ScopeVMap = 0x001D, +RDI_SectionKind_InlineSites = 0x001E, +RDI_SectionKind_Locals = 0x001F, +RDI_SectionKind_LocationBlocks = 0x0020, +RDI_SectionKind_LocationData = 0x0021, +RDI_SectionKind_ConstantValueData = 0x0022, +RDI_SectionKind_ConstantValueTable = 0x0023, +RDI_SectionKind_NameMaps = 0x0024, +RDI_SectionKind_NameMapBuckets = 0x0025, +RDI_SectionKind_NameMapNodes = 0x0026, +RDI_SectionKind_COUNT = 0x0027, +} RDI_SectionKindEnum; + +typedef RDI_U32 RDI_SectionEncoding; +typedef enum RDI_SectionEncodingEnum +{ +RDI_SectionEncoding_Unpacked = 0, +RDI_SectionEncoding_LZB = 1, +} RDI_SectionEncodingEnum; + +typedef RDI_U32 RDI_Arch; +typedef enum RDI_ArchEnum +{ +RDI_Arch_NULL = 0, +RDI_Arch_X86 = 1, +RDI_Arch_X64 = 2, +} RDI_ArchEnum; + +typedef RDI_U8 RDI_RegCode; +typedef enum RDI_RegCodeEnum +{ +RDI_RegCode_nil, +} RDI_RegCodeEnum; + +typedef RDI_U8 RDI_RegCodeX86; +typedef enum RDI_RegCodeX86Enum +{ +RDI_RegCodeX86_nil = 0, +RDI_RegCodeX86_eax = 1, +RDI_RegCodeX86_ecx = 2, +RDI_RegCodeX86_edx = 3, +RDI_RegCodeX86_ebx = 4, +RDI_RegCodeX86_esp = 5, +RDI_RegCodeX86_ebp = 6, +RDI_RegCodeX86_esi = 7, +RDI_RegCodeX86_edi = 8, +RDI_RegCodeX86_fsbase = 9, +RDI_RegCodeX86_gsbase = 10, +RDI_RegCodeX86_eflags = 11, +RDI_RegCodeX86_eip = 12, +RDI_RegCodeX86_dr0 = 13, +RDI_RegCodeX86_dr1 = 14, +RDI_RegCodeX86_dr2 = 15, +RDI_RegCodeX86_dr3 = 16, +RDI_RegCodeX86_dr4 = 17, +RDI_RegCodeX86_dr5 = 18, +RDI_RegCodeX86_dr6 = 19, +RDI_RegCodeX86_dr7 = 20, +RDI_RegCodeX86_fpr0 = 21, +RDI_RegCodeX86_fpr1 = 22, +RDI_RegCodeX86_fpr2 = 23, +RDI_RegCodeX86_fpr3 = 24, +RDI_RegCodeX86_fpr4 = 25, +RDI_RegCodeX86_fpr5 = 26, +RDI_RegCodeX86_fpr6 = 27, +RDI_RegCodeX86_fpr7 = 28, +RDI_RegCodeX86_st0 = 29, +RDI_RegCodeX86_st1 = 30, +RDI_RegCodeX86_st2 = 31, +RDI_RegCodeX86_st3 = 32, +RDI_RegCodeX86_st4 = 33, +RDI_RegCodeX86_st5 = 34, +RDI_RegCodeX86_st6 = 35, +RDI_RegCodeX86_st7 = 36, +RDI_RegCodeX86_fcw = 37, +RDI_RegCodeX86_fsw = 38, +RDI_RegCodeX86_ftw = 39, +RDI_RegCodeX86_fop = 40, +RDI_RegCodeX86_fcs = 41, +RDI_RegCodeX86_fds = 42, +RDI_RegCodeX86_fip = 43, +RDI_RegCodeX86_fdp = 44, +RDI_RegCodeX86_mxcsr = 45, +RDI_RegCodeX86_mxcsr_mask = 46, +RDI_RegCodeX86_ss = 47, +RDI_RegCodeX86_cs = 48, +RDI_RegCodeX86_ds = 49, +RDI_RegCodeX86_es = 50, +RDI_RegCodeX86_fs = 51, +RDI_RegCodeX86_gs = 52, +RDI_RegCodeX86_ymm0 = 53, +RDI_RegCodeX86_ymm1 = 54, +RDI_RegCodeX86_ymm2 = 55, +RDI_RegCodeX86_ymm3 = 56, +RDI_RegCodeX86_ymm4 = 57, +RDI_RegCodeX86_ymm5 = 58, +RDI_RegCodeX86_ymm6 = 59, +RDI_RegCodeX86_ymm7 = 60, +} RDI_RegCodeX86Enum; + +typedef RDI_U8 RDI_RegCodeX64; +typedef enum RDI_RegCodeX64Enum +{ +RDI_RegCodeX64_nil = 0, +RDI_RegCodeX64_rax = 1, +RDI_RegCodeX64_rcx = 2, +RDI_RegCodeX64_rdx = 3, +RDI_RegCodeX64_rbx = 4, +RDI_RegCodeX64_rsp = 5, +RDI_RegCodeX64_rbp = 6, +RDI_RegCodeX64_rsi = 7, +RDI_RegCodeX64_rdi = 8, +RDI_RegCodeX64_r8 = 9, +RDI_RegCodeX64_r9 = 10, +RDI_RegCodeX64_r10 = 11, +RDI_RegCodeX64_r11 = 12, +RDI_RegCodeX64_r12 = 13, +RDI_RegCodeX64_r13 = 14, +RDI_RegCodeX64_r14 = 15, +RDI_RegCodeX64_r15 = 16, +RDI_RegCodeX64_es = 17, +RDI_RegCodeX64_cs = 18, +RDI_RegCodeX64_ss = 19, +RDI_RegCodeX64_ds = 20, +RDI_RegCodeX64_fs = 21, +RDI_RegCodeX64_gs = 22, +RDI_RegCodeX64_rip = 23, +RDI_RegCodeX64_rflags = 24, +RDI_RegCodeX64_dr0 = 25, +RDI_RegCodeX64_dr1 = 26, +RDI_RegCodeX64_dr2 = 27, +RDI_RegCodeX64_dr3 = 28, +RDI_RegCodeX64_dr4 = 29, +RDI_RegCodeX64_dr5 = 30, +RDI_RegCodeX64_dr6 = 31, +RDI_RegCodeX64_dr7 = 32, +RDI_RegCodeX64_st0 = 33, +RDI_RegCodeX64_st1 = 34, +RDI_RegCodeX64_st2 = 35, +RDI_RegCodeX64_st3 = 36, +RDI_RegCodeX64_st4 = 37, +RDI_RegCodeX64_st5 = 38, +RDI_RegCodeX64_st6 = 39, +RDI_RegCodeX64_st7 = 40, +RDI_RegCodeX64_fpr0 = 41, +RDI_RegCodeX64_fpr1 = 42, +RDI_RegCodeX64_fpr2 = 43, +RDI_RegCodeX64_fpr3 = 44, +RDI_RegCodeX64_fpr4 = 45, +RDI_RegCodeX64_fpr5 = 46, +RDI_RegCodeX64_fpr6 = 47, +RDI_RegCodeX64_fpr7 = 48, +RDI_RegCodeX64_zmm0 = 49, +RDI_RegCodeX64_zmm1 = 50, +RDI_RegCodeX64_zmm2 = 51, +RDI_RegCodeX64_zmm3 = 52, +RDI_RegCodeX64_zmm4 = 53, +RDI_RegCodeX64_zmm5 = 54, +RDI_RegCodeX64_zmm6 = 55, +RDI_RegCodeX64_zmm7 = 56, +RDI_RegCodeX64_zmm8 = 57, +RDI_RegCodeX64_zmm9 = 58, +RDI_RegCodeX64_zmm10 = 59, +RDI_RegCodeX64_zmm11 = 60, +RDI_RegCodeX64_zmm12 = 61, +RDI_RegCodeX64_zmm13 = 62, +RDI_RegCodeX64_zmm14 = 63, +RDI_RegCodeX64_zmm15 = 64, +RDI_RegCodeX64_zmm16 = 65, +RDI_RegCodeX64_zmm17 = 66, +RDI_RegCodeX64_zmm18 = 67, +RDI_RegCodeX64_zmm19 = 68, +RDI_RegCodeX64_zmm20 = 69, +RDI_RegCodeX64_zmm21 = 70, +RDI_RegCodeX64_zmm22 = 71, +RDI_RegCodeX64_zmm23 = 72, +RDI_RegCodeX64_zmm24 = 73, +RDI_RegCodeX64_zmm25 = 74, +RDI_RegCodeX64_zmm26 = 75, +RDI_RegCodeX64_zmm27 = 76, +RDI_RegCodeX64_zmm28 = 77, +RDI_RegCodeX64_zmm29 = 78, +RDI_RegCodeX64_zmm30 = 79, +RDI_RegCodeX64_zmm31 = 80, +RDI_RegCodeX64_k0 = 81, +RDI_RegCodeX64_k1 = 82, +RDI_RegCodeX64_k2 = 83, +RDI_RegCodeX64_k3 = 84, +RDI_RegCodeX64_k4 = 85, +RDI_RegCodeX64_k5 = 86, +RDI_RegCodeX64_k6 = 87, +RDI_RegCodeX64_k7 = 88, +RDI_RegCodeX64_mxcsr = 89, +RDI_RegCodeX64_fsbase = 90, +RDI_RegCodeX64_gsbase = 91, +RDI_RegCodeX64_fcw = 92, +RDI_RegCodeX64_fsw = 93, +RDI_RegCodeX64_ftw = 94, +RDI_RegCodeX64_fop = 95, +RDI_RegCodeX64_fcs = 96, +RDI_RegCodeX64_fds = 97, +RDI_RegCodeX64_fip = 98, +RDI_RegCodeX64_fdp = 99, +RDI_RegCodeX64_mxcsr_mask = 100, +} RDI_RegCodeX64Enum; + +typedef RDI_U32 RDI_BinarySectionFlags; +typedef enum RDI_BinarySectionFlagsEnum +{ +RDI_BinarySectionFlag_Read = 1<<0, +RDI_BinarySectionFlag_Write = 1<<1, +RDI_BinarySectionFlag_Execute = 1<<2, +} RDI_BinarySectionFlagsEnum; + +typedef RDI_U32 RDI_Language; +typedef enum RDI_LanguageEnum +{ +RDI_Language_NULL = 0, +RDI_Language_C = 1, +RDI_Language_CPlusPlus = 2, +RDI_Language_Masm = 3, +RDI_Language_COUNT = 4, +} RDI_LanguageEnum; + +typedef RDI_U16 RDI_TypeKind; +typedef enum RDI_TypeKindEnum +{ +RDI_TypeKind_NULL = 0x0000, +RDI_TypeKind_Void = 0x0001, +RDI_TypeKind_Handle = 0x0002, +RDI_TypeKind_HResult = 0x0003, +RDI_TypeKind_Char8 = 0x0004, +RDI_TypeKind_Char16 = 0x0005, +RDI_TypeKind_Char32 = 0x0006, +RDI_TypeKind_UChar8 = 0x0007, +RDI_TypeKind_UChar16 = 0x0008, +RDI_TypeKind_UChar32 = 0x0009, +RDI_TypeKind_U8 = 0x000A, +RDI_TypeKind_U16 = 0x000B, +RDI_TypeKind_U32 = 0x000C, +RDI_TypeKind_U64 = 0x000D, +RDI_TypeKind_U128 = 0x000E, +RDI_TypeKind_U256 = 0x000F, +RDI_TypeKind_U512 = 0x0010, +RDI_TypeKind_S8 = 0x0011, +RDI_TypeKind_S16 = 0x0012, +RDI_TypeKind_S32 = 0x0013, +RDI_TypeKind_S64 = 0x0014, +RDI_TypeKind_S128 = 0x0015, +RDI_TypeKind_S256 = 0x0016, +RDI_TypeKind_S512 = 0x0017, +RDI_TypeKind_Bool = 0x0018, +RDI_TypeKind_F16 = 0x0019, +RDI_TypeKind_F32 = 0x001A, +RDI_TypeKind_F32PP = 0x001B, +RDI_TypeKind_F48 = 0x001C, +RDI_TypeKind_F64 = 0x001D, +RDI_TypeKind_F80 = 0x001E, +RDI_TypeKind_F128 = 0x001F, +RDI_TypeKind_ComplexF32 = 0x0020, +RDI_TypeKind_ComplexF64 = 0x0021, +RDI_TypeKind_ComplexF80 = 0x0022, +RDI_TypeKind_ComplexF128 = 0x0023, +RDI_TypeKind_Modifier = 0x1000, +RDI_TypeKind_Ptr = 0x1001, +RDI_TypeKind_LRef = 0x1002, +RDI_TypeKind_RRef = 0x1003, +RDI_TypeKind_Array = 0x1004, +RDI_TypeKind_Function = 0x1005, +RDI_TypeKind_Method = 0x1006, +RDI_TypeKind_MemberPtr = 0x1007, +RDI_TypeKind_Struct = 0x2000, +RDI_TypeKind_Class = 0x2001, +RDI_TypeKind_Union = 0x2002, +RDI_TypeKind_Enum = 0x2003, +RDI_TypeKind_Alias = 0x2004, +RDI_TypeKind_IncompleteStruct = 0x2005, +RDI_TypeKind_IncompleteUnion = 0x2006, +RDI_TypeKind_IncompleteClass = 0x2007, +RDI_TypeKind_IncompleteEnum = 0x2008, +RDI_TypeKind_Bitfield = 0xF000, +RDI_TypeKind_Variadic = 0xF001, +RDI_TypeKind_Count = 0xF002, +RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, +RDI_TypeKind_LastBuiltIn = RDI_TypeKind_ComplexF128, +RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, +RDI_TypeKind_LastConstructed = RDI_TypeKind_MemberPtr, +RDI_TypeKind_FirstUserDefined = RDI_TypeKind_Struct, +RDI_TypeKind_LastRecord = RDI_TypeKind_Union, +RDI_TypeKind_FirstIncomplete = RDI_TypeKind_IncompleteStruct, +RDI_TypeKind_LastIncomplete = RDI_TypeKind_IncompleteEnum, +RDI_TypeKind_FirstRecord = RDI_TypeKind_Struct, +RDI_TypeKind_LastUserDefined = RDI_TypeKind_IncompleteEnum, +} RDI_TypeKindEnum; + +typedef RDI_U16 RDI_TypeModifierFlags; +typedef enum RDI_TypeModifierFlagsEnum +{ +RDI_TypeModifierFlag_Const = 1<<0, +RDI_TypeModifierFlag_Volatile = 1<<1, +RDI_TypeModifierFlag_Restrict = 1<<2, +} RDI_TypeModifierFlagsEnum; + +typedef RDI_U32 RDI_UDTFlags; +typedef enum RDI_UDTFlagsEnum +{ +RDI_UDTFlag_EnumMembers = 1<<0, +} RDI_UDTFlagsEnum; + +typedef RDI_U16 RDI_MemberKind; +typedef enum RDI_MemberKindEnum +{ +RDI_MemberKind_NULL = 0x0000, +RDI_MemberKind_DataField = 0x0001, +RDI_MemberKind_StaticData = 0x0002, +RDI_MemberKind_Method = 0x0100, +RDI_MemberKind_StaticMethod = 0x0101, +RDI_MemberKind_VirtualMethod = 0x0102, +RDI_MemberKind_VTablePtr = 0x0200, +RDI_MemberKind_Base = 0x0201, +RDI_MemberKind_VirtualBase = 0x0202, +RDI_MemberKind_NestedType = 0x0300, +} RDI_MemberKindEnum; + +typedef RDI_U32 RDI_LinkFlags; +typedef enum RDI_LinkFlagsEnum +{ +RDI_LinkFlag_External = 1<<0, +RDI_LinkFlag_TypeScoped = 1<<1, +RDI_LinkFlag_ProcScoped = 1<<2, +} RDI_LinkFlagsEnum; + +typedef RDI_U32 RDI_LocalKind; +typedef enum RDI_LocalKindEnum +{ +RDI_LocalKind_NULL = 0x0, +RDI_LocalKind_Parameter = 0x1, +RDI_LocalKind_Variable = 0x2, +} RDI_LocalKindEnum; + +typedef RDI_U8 RDI_LocationKind; +typedef enum RDI_LocationKindEnum +{ +RDI_LocationKind_NULL = 0x0, +RDI_LocationKind_AddrBytecodeStream = 0x1, +RDI_LocationKind_ValBytecodeStream = 0x2, +RDI_LocationKind_AddrRegPlusU16 = 0x3, +RDI_LocationKind_AddrAddrRegPlusU16 = 0x4, +RDI_LocationKind_ValReg = 0x5, +} RDI_LocationKindEnum; + +typedef RDI_U8 RDI_EvalOp; +typedef enum RDI_EvalOpEnum +{ +RDI_EvalOp_Stop = 0, +RDI_EvalOp_Noop = 1, +RDI_EvalOp_Cond = 2, +RDI_EvalOp_Skip = 3, +RDI_EvalOp_MemRead = 4, +RDI_EvalOp_RegRead = 5, +RDI_EvalOp_RegReadDyn = 6, +RDI_EvalOp_FrameOff = 7, +RDI_EvalOp_ModuleOff = 8, +RDI_EvalOp_TLSOff = 9, +RDI_EvalOp_ObjectOff = 10, +RDI_EvalOp_CFA = 11, +RDI_EvalOp_ConstU8 = 12, +RDI_EvalOp_ConstU16 = 13, +RDI_EvalOp_ConstU32 = 14, +RDI_EvalOp_ConstU64 = 15, +RDI_EvalOp_ConstU128 = 16, +RDI_EvalOp_ConstString = 17, +RDI_EvalOp_Abs = 18, +RDI_EvalOp_Neg = 19, +RDI_EvalOp_Add = 20, +RDI_EvalOp_Sub = 21, +RDI_EvalOp_Mul = 22, +RDI_EvalOp_Div = 23, +RDI_EvalOp_Mod = 24, +RDI_EvalOp_LShift = 25, +RDI_EvalOp_RShift = 26, +RDI_EvalOp_BitAnd = 27, +RDI_EvalOp_BitOr = 28, +RDI_EvalOp_BitXor = 29, +RDI_EvalOp_BitNot = 30, +RDI_EvalOp_LogAnd = 31, +RDI_EvalOp_LogOr = 32, +RDI_EvalOp_LogNot = 33, +RDI_EvalOp_EqEq = 34, +RDI_EvalOp_NtEq = 35, +RDI_EvalOp_LsEq = 36, +RDI_EvalOp_GrEq = 37, +RDI_EvalOp_Less = 38, +RDI_EvalOp_Grtr = 39, +RDI_EvalOp_Trunc = 40, +RDI_EvalOp_TruncSigned = 41, +RDI_EvalOp_Convert = 42, +RDI_EvalOp_Pick = 43, +RDI_EvalOp_Pop = 44, +RDI_EvalOp_Insert = 45, +RDI_EvalOp_ValueRead = 46, +RDI_EvalOp_ByteSwap = 47, +RDI_EvalOp_CallSiteValue = 48, +RDI_EvalOp_PartialValue = 49, +RDI_EvalOp_PartialValueBit = 50, +RDI_EvalOp_COUNT = 51, +} RDI_EvalOpEnum; + +typedef RDI_U8 RDI_EvalTypeGroup; +typedef enum RDI_EvalTypeGroupEnum +{ +RDI_EvalTypeGroup_Other = 0, +RDI_EvalTypeGroup_U = 1, +RDI_EvalTypeGroup_S = 2, +RDI_EvalTypeGroup_F32 = 3, +RDI_EvalTypeGroup_F64 = 4, +RDI_EvalTypeGroup_COUNT = 5, +} RDI_EvalTypeGroupEnum; + +typedef RDI_U8 RDI_EvalConversionKind; +typedef enum RDI_EvalConversionKindEnum +{ +RDI_EvalConversionKind_Noop = 0, +RDI_EvalConversionKind_Legal = 1, +RDI_EvalConversionKind_OtherToOther = 2, +RDI_EvalConversionKind_ToOther = 3, +RDI_EvalConversionKind_FromOther = 4, +RDI_EvalConversionKind_COUNT = 5, +} RDI_EvalConversionKindEnum; + +typedef RDI_U32 RDI_NameMapKind; +typedef enum RDI_NameMapKindEnum +{ +RDI_NameMapKind_NULL = 0, +RDI_NameMapKind_GlobalVariables = 1, +RDI_NameMapKind_ThreadVariables = 2, +RDI_NameMapKind_Constants = 3, +RDI_NameMapKind_Procedures = 4, +RDI_NameMapKind_Types = 5, +RDI_NameMapKind_LinkNameProcedures = 6, +RDI_NameMapKind_NormalSourcePaths = 7, +RDI_NameMapKind_COUNT = 8, +} RDI_NameMapKindEnum; + +#define RDI_Header_XList \ +X(RDI_U64, magic)\ +X(RDI_U32, encoding_version)\ +X(RDI_U32, data_section_off)\ +X(RDI_U32, data_section_count)\ + +#define RDI_SectionKind_XList \ +X(NULL, null, RDI_U8)\ +X(TopLevelInfo, top_level_info, RDI_TopLevelInfo)\ +X(StringData, string_data, RDI_U8)\ +X(StringTable, string_table, RDI_U32)\ +X(IndexRuns, index_runs, RDI_U32)\ +X(BinarySections, binary_sections, RDI_BinarySection)\ +X(FilePathNodes, file_path_nodes, RDI_FilePathNode)\ +X(SourceFiles, source_files, RDI_SourceFile)\ +X(LineTables, line_tables, RDI_LineTable)\ +X(LineInfoVOffs, line_info_voffs, RDI_U64)\ +X(LineInfoLines, line_info_lines, RDI_Line)\ +X(LineInfoColumns, line_info_columns, RDI_Column)\ +X(SourceLineMaps, source_line_maps, RDI_SourceLineMap)\ +X(SourceLineMapNumbers, source_line_map_numbers, RDI_U32)\ +X(SourceLineMapRanges, source_line_map_ranges, RDI_U32)\ +X(SourceLineMapVOffs, source_line_map_voffs, RDI_U64)\ +X(Units, units, RDI_Unit)\ +X(UnitVMap, unit_vmap, RDI_VMapEntry)\ +X(TypeNodes, type_nodes, RDI_TypeNode)\ +X(UDTs, udts, RDI_UDT)\ +X(Members, members, RDI_Member)\ +X(EnumMembers, enum_members, RDI_EnumMember)\ +X(GlobalVariables, global_variables, RDI_GlobalVariable)\ +X(GlobalVMap, global_vmap, RDI_VMapEntry)\ +X(ThreadVariables, thread_variables, RDI_ThreadVariable)\ +X(Constants, constants, RDI_Constant)\ +X(Procedures, procedures, RDI_Procedure)\ +X(Scopes, scopes, RDI_Scope)\ +X(ScopeVOffData, scope_voff_data, RDI_U64)\ +X(ScopeVMap, scope_vmap, RDI_VMapEntry)\ +X(InlineSites, inline_sites, RDI_InlineSite)\ +X(Locals, locals, RDI_Local)\ +X(LocationBlocks, location_blocks, RDI_LocationBlock)\ +X(LocationData, location_data, RDI_U8)\ +X(ConstantValueData, constant_value_data, RDI_U8)\ +X(ConstantValueTable, constant_value_table, RDI_U32)\ +X(NameMaps, name_maps, RDI_NameMap)\ +X(NameMapBuckets, name_map_buckets, RDI_NameMapBucket)\ +X(NameMapNodes, name_map_nodes, RDI_NameMapNode)\ + +#define RDI_SectionEncoding_XList \ +X(Unpacked)\ +X(LZB)\ + +#define RDI_Section_XList \ +X(RDI_SectionEncoding, encoding)\ +X(RDI_U32, pad)\ +X(RDI_U64, off)\ +X(RDI_U64, encoded_size)\ +X(RDI_U64, unpacked_size)\ + +#define RDI_VMapEntry_XList \ +X(RDI_U64, voff)\ +X(RDI_U64, idx)\ + +#define RDI_Arch_XList \ +X(NULL)\ +X(X86)\ +X(X64)\ + +#define RDI_RegCodeX86_XList \ +X(nil, 0)\ +X(eax, 1)\ +X(ecx, 2)\ +X(edx, 3)\ +X(ebx, 4)\ +X(esp, 5)\ +X(ebp, 6)\ +X(esi, 7)\ +X(edi, 8)\ +X(fsbase, 9)\ +X(gsbase, 10)\ +X(eflags, 11)\ +X(eip, 12)\ +X(dr0, 13)\ +X(dr1, 14)\ +X(dr2, 15)\ +X(dr3, 16)\ +X(dr4, 17)\ +X(dr5, 18)\ +X(dr6, 19)\ +X(dr7, 20)\ +X(fpr0, 21)\ +X(fpr1, 22)\ +X(fpr2, 23)\ +X(fpr3, 24)\ +X(fpr4, 25)\ +X(fpr5, 26)\ +X(fpr6, 27)\ +X(fpr7, 28)\ +X(st0, 29)\ +X(st1, 30)\ +X(st2, 31)\ +X(st3, 32)\ +X(st4, 33)\ +X(st5, 34)\ +X(st6, 35)\ +X(st7, 36)\ +X(fcw, 37)\ +X(fsw, 38)\ +X(ftw, 39)\ +X(fop, 40)\ +X(fcs, 41)\ +X(fds, 42)\ +X(fip, 43)\ +X(fdp, 44)\ +X(mxcsr, 45)\ +X(mxcsr_mask, 46)\ +X(ss, 47)\ +X(cs, 48)\ +X(ds, 49)\ +X(es, 50)\ +X(fs, 51)\ +X(gs, 52)\ +X(ymm0, 53)\ +X(ymm1, 54)\ +X(ymm2, 55)\ +X(ymm3, 56)\ +X(ymm4, 57)\ +X(ymm5, 58)\ +X(ymm6, 59)\ +X(ymm7, 60)\ + +#define RDI_RegCodeX64_XList \ +X(nil, 0)\ +X(rax, 1)\ +X(rcx, 2)\ +X(rdx, 3)\ +X(rbx, 4)\ +X(rsp, 5)\ +X(rbp, 6)\ +X(rsi, 7)\ +X(rdi, 8)\ +X(r8, 9)\ +X(r9, 10)\ +X(r10, 11)\ +X(r11, 12)\ +X(r12, 13)\ +X(r13, 14)\ +X(r14, 15)\ +X(r15, 16)\ +X(es, 17)\ +X(cs, 18)\ +X(ss, 19)\ +X(ds, 20)\ +X(fs, 21)\ +X(gs, 22)\ +X(rip, 23)\ +X(rflags, 24)\ +X(dr0, 25)\ +X(dr1, 26)\ +X(dr2, 27)\ +X(dr3, 28)\ +X(dr4, 29)\ +X(dr5, 30)\ +X(dr6, 31)\ +X(dr7, 32)\ +X(st0, 33)\ +X(st1, 34)\ +X(st2, 35)\ +X(st3, 36)\ +X(st4, 37)\ +X(st5, 38)\ +X(st6, 39)\ +X(st7, 40)\ +X(fpr0, 41)\ +X(fpr1, 42)\ +X(fpr2, 43)\ +X(fpr3, 44)\ +X(fpr4, 45)\ +X(fpr5, 46)\ +X(fpr6, 47)\ +X(fpr7, 48)\ +X(zmm0, 49)\ +X(zmm1, 50)\ +X(zmm2, 51)\ +X(zmm3, 52)\ +X(zmm4, 53)\ +X(zmm5, 54)\ +X(zmm6, 55)\ +X(zmm7, 56)\ +X(zmm8, 57)\ +X(zmm9, 58)\ +X(zmm10, 59)\ +X(zmm11, 60)\ +X(zmm12, 61)\ +X(zmm13, 62)\ +X(zmm14, 63)\ +X(zmm15, 64)\ +X(zmm16, 65)\ +X(zmm17, 66)\ +X(zmm18, 67)\ +X(zmm19, 68)\ +X(zmm20, 69)\ +X(zmm21, 70)\ +X(zmm22, 71)\ +X(zmm23, 72)\ +X(zmm24, 73)\ +X(zmm25, 74)\ +X(zmm26, 75)\ +X(zmm27, 76)\ +X(zmm28, 77)\ +X(zmm29, 78)\ +X(zmm30, 79)\ +X(zmm31, 80)\ +X(k0, 81)\ +X(k1, 82)\ +X(k2, 83)\ +X(k3, 84)\ +X(k4, 85)\ +X(k5, 86)\ +X(k6, 87)\ +X(k7, 88)\ +X(mxcsr, 89)\ +X(fsbase, 90)\ +X(gsbase, 91)\ +X(fcw, 92)\ +X(fsw, 93)\ +X(ftw, 94)\ +X(fop, 95)\ +X(fcs, 96)\ +X(fds, 97)\ +X(fip, 98)\ +X(fdp, 99)\ +X(mxcsr_mask, 100)\ + +#define RDI_TopLevelInfo_XList \ +X(RDI_Arch, arch)\ +X(RDI_U32, exe_name_string_idx)\ +X(RDI_U64, exe_hash)\ +X(RDI_U64, voff_max)\ +X(RDI_U32, producer_name_string_idx)\ + +#define RDI_BinarySectionFlags_XList \ +X(Read)\ +X(Write)\ +X(Execute)\ + +#define RDI_BinarySection_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_BinarySectionFlags, flags)\ +X(RDI_U64, voff_first)\ +X(RDI_U64, voff_opl)\ +X(RDI_U64, foff_first)\ +X(RDI_U64, foff_opl)\ + +#define RDI_FilePathNode_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, parent_path_node)\ +X(RDI_U32, first_child)\ +X(RDI_U32, next_sibling)\ +X(RDI_U32, source_file_idx)\ + +#define RDI_SourceFile_XList \ +X(RDI_U32, file_path_node_idx)\ +X(RDI_U32, normal_full_path_string_idx)\ +X(RDI_U32, source_line_map_idx)\ + +#define RDI_Unit_XList \ +X(RDI_U32, unit_name_string_idx)\ +X(RDI_U32, compiler_name_string_idx)\ +X(RDI_U32, source_file_path_node)\ +X(RDI_U32, object_file_path_node)\ +X(RDI_U32, archive_file_path_node)\ +X(RDI_U32, build_path_node)\ +X(RDI_Language, language)\ +X(RDI_U32, line_table_idx)\ + +#define RDI_LineTable_XList \ +X(RDI_U32, voffs_base_idx)\ +X(RDI_U32, lines_base_idx)\ +X(RDI_U32, cols_base_idx)\ +X(RDI_U32, lines_count)\ +X(RDI_U32, cols_count)\ + +#define RDI_Line_XList \ +X(RDI_U32, file_idx)\ +X(RDI_U32, line_num)\ + +#define RDI_Column_XList \ +X(RDI_U16, col_first)\ +X(RDI_U16, col_opl)\ + +#define RDI_SourceLineMapMemberTable \ +X(RDI_U32, line_count)\ +X(RDI_U32, voff_count)\ +X(RDI_U32, line_map_nums_base_idx)\ +X(RDI_U32, line_map_range_base_idx)\ +X(RDI_U32, line_map_voff_base_idx)\ + +#define RDI_Language_XList \ +X(NULL)\ +X(C)\ +X(CPlusPlus)\ +X(Masm)\ +X(COUNT)\ + +#define RDI_TypeKind_XList \ +X(NULL)\ +X(Void)\ +X(Handle)\ +X(HResult)\ +X(Char8)\ +X(Char16)\ +X(Char32)\ +X(UChar8)\ +X(UChar16)\ +X(UChar32)\ +X(U8)\ +X(U16)\ +X(U32)\ +X(U64)\ +X(U128)\ +X(U256)\ +X(U512)\ +X(S8)\ +X(S16)\ +X(S32)\ +X(S64)\ +X(S128)\ +X(S256)\ +X(S512)\ +X(Bool)\ +X(F16)\ +X(F32)\ +X(F32PP)\ +X(F48)\ +X(F64)\ +X(F80)\ +X(F128)\ +X(ComplexF32)\ +X(ComplexF64)\ +X(ComplexF80)\ +X(ComplexF128)\ +X(Modifier)\ +X(Ptr)\ +X(LRef)\ +X(RRef)\ +X(Array)\ +X(Function)\ +X(Method)\ +X(MemberPtr)\ +X(Struct)\ +X(Class)\ +X(Union)\ +X(Enum)\ +X(Alias)\ +X(IncompleteStruct)\ +X(IncompleteUnion)\ +X(IncompleteClass)\ +X(IncompleteEnum)\ +X(Bitfield)\ +X(Variadic)\ +X(Count)\ + +#define RDI_TypeModifierFlags_XList \ +X(Const)\ +X(Volatile)\ +X(Restrict)\ + +#define RDI_TypeNode_XList \ +X(RDI_TypeKind, kind)\ +X(RDI_U16, flags)\ +X(RDI_U32, byte_size)\ + +#define RDI_UDTFlags_XList \ +X(EnumMembers)\ + +#define RDI_UDT_XList \ +X(RDI_U32, self_type_idx)\ +X(RDI_UDTFlags, flags)\ +X(RDI_U32, member_first)\ +X(RDI_U32, member_count)\ +X(RDI_U32, file_idx)\ +X(RDI_U32, line)\ +X(RDI_U32, col)\ + +#define RDI_MemberKind_XList \ +X(NULL)\ +X(DataField)\ +X(StaticData)\ +X(Method)\ +X(StaticMethod)\ +X(VirtualMethod)\ +X(VTablePtr)\ +X(Base)\ +X(VirtualBase)\ +X(NestedType)\ + +#define RDI_Member_XList \ +X(RDI_MemberKind, kind)\ +X(RDI_U16, pad)\ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, type_idx)\ +X(RDI_U32, off)\ + +#define RDI_EnumMember_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, pad)\ +X(RDI_U64, val)\ + +#define RDI_LinkFlags_XList \ +X(External)\ +X(TypeScoped)\ +X(ProcScoped)\ + +#define RDI_LocalKind_XList \ +X(NULL)\ +X(Parameter)\ +X(Variable)\ + +#define RDI_LocationKind_XList \ +X(NULL)\ +X(AddrBytecodeStream)\ +X(ValBytecodeStream)\ +X(AddrRegPlusU16)\ +X(AddrAddrRegPlusU16)\ +X(ValReg)\ + +#define RDI_GlobalVariable_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_LinkFlags, link_flags)\ +X(RDI_U64, voff)\ +X(RDI_U32, type_idx)\ +X(RDI_U32, container_idx)\ + +#define RDI_ThreadVariable_XList \ +X(type, name_string_idx)\ +X(type, link_flags)\ +X(type, tls_off)\ +X(type, type_idx)\ +X(type, container_idx)\ + +#define RDI_Procedure_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, link_name_string_idx)\ +X(RDI_LinkFlags, link_flags)\ +X(RDI_U32, type_idx)\ +X(RDI_U32, root_scope_idx)\ +X(RDI_U32, container_idx)\ +X(RDI_U32, frame_base_location_first)\ +X(RDI_U32, frame_base_location_opl)\ + +#define RDI_Scope_XList \ +X(RDI_U32, proc_idx)\ +X(RDI_U32, parent_scope_idx)\ +X(RDI_U32, first_child_scope_idx)\ +X(RDI_U32, next_sibling_scope_idx)\ +X(RDI_U32, voff_range_first)\ +X(RDI_U32, voff_range_opl)\ +X(RDI_U32, local_first)\ +X(RDI_U32, local_count)\ +X(RDI_U32, static_local_idx_run_first)\ +X(RDI_U32, static_local_count)\ +X(RDI_U32, inline_site_idx)\ + +#define RDI_InlineSite_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, type_idx)\ +X(RDI_U32, owner_type_idx)\ +X(RDI_U32, line_table_idx)\ + +#define RDI_Local_XList \ +X(RDI_LocalKind, kind)\ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, type_idx)\ +X(RDI_U32, pad)\ +X(RDI_U32, location_first)\ +X(RDI_U32, location_opl)\ + +#define RDI_LocationBlock_XList \ +X(RDI_U32, scope_off_first)\ +X(RDI_U32, scope_off_opl)\ +X(RDI_U32, location_data_off)\ + +#define RDI_LocationBytecodeStream_XList \ +X(RDI_LocationKind, kind)\ + +#define RDI_LocationRegPlusU16_XList \ +X(RDI_LocationKind, kind)\ +X(RDI_RegCode, reg_code)\ +X(RDI_U16, offset)\ + +#define RDI_LocationReg_XList \ +X(RDI_LocationKind, kind)\ +X(RDI_RegCode, reg_code)\ + +#define RDI_EvalOp_XList \ +X(Stop)\ +X(Noop)\ +X(Cond)\ +X(Skip)\ +X(MemRead)\ +X(RegRead)\ +X(RegReadDyn)\ +X(FrameOff)\ +X(ModuleOff)\ +X(TLSOff)\ +X(ObjectOff)\ +X(CFA)\ +X(ConstU8)\ +X(ConstU16)\ +X(ConstU32)\ +X(ConstU64)\ +X(ConstU128)\ +X(ConstString)\ +X(Abs)\ +X(Neg)\ +X(Add)\ +X(Sub)\ +X(Mul)\ +X(Div)\ +X(Mod)\ +X(LShift)\ +X(RShift)\ +X(BitAnd)\ +X(BitOr)\ +X(BitXor)\ +X(BitNot)\ +X(LogAnd)\ +X(LogOr)\ +X(LogNot)\ +X(EqEq)\ +X(NtEq)\ +X(LsEq)\ +X(GrEq)\ +X(Less)\ +X(Grtr)\ +X(Trunc)\ +X(TruncSigned)\ +X(Convert)\ +X(Pick)\ +X(Pop)\ +X(Insert)\ +X(ValueRead)\ +X(ByteSwap)\ +X(CallSiteValue)\ +X(PartialValue)\ +X(PartialValueBit)\ + +#define RDI_EvalTypeGroup_XList \ +X(Other)\ +X(U)\ +X(S)\ +X(F32)\ +X(F64)\ + +#define RDI_EvalConversionKind_XList \ +X(Noop)\ +X(Legal)\ +X(OtherToOther)\ +X(ToOther)\ +X(FromOther)\ + +#define RDI_NameMapKind_XList \ +X(NULL)\ +X(GlobalVariables)\ +X(ThreadVariables)\ +X(Constants)\ +X(Procedures)\ +X(Types)\ +X(LinkNameProcedures)\ +X(NormalSourcePaths)\ + +#define RDI_NameMap_XList \ +X(RDI_U32, bucket_base_idx)\ +X(RDI_U32, node_base_idx)\ +X(RDI_U32, bucket_count)\ +X(RDI_U32, node_count)\ + +#define RDI_NameMapBucket_XList \ +X(RDI_U32, first_node)\ +X(RDI_U32, node_count)\ + +#define RDI_NameMapNode_XList \ +X(RDI_U32, string_idx)\ +X(RDI_U32, match_count)\ +X(RDI_U32, match_idx_or_idx_run_first)\ + +#if !RDI_DISABLE_TABLE_INDEX_TYPECHECKING +typedef struct RDI_U32_StringTable { RDI_U32 v; } RDI_U32_StringTable; +typedef struct RDI_U32_IndexRuns { RDI_U32 v; } RDI_U32_IndexRuns; +typedef struct RDI_U32_BinarySections { RDI_U32 v; } RDI_U32_BinarySections; +typedef struct RDI_U32_FilePathNodes { RDI_U32 v; } RDI_U32_FilePathNodes; +typedef struct RDI_U32_SourceFiles { RDI_U32 v; } RDI_U32_SourceFiles; +typedef struct RDI_U32_LineTables { RDI_U32 v; } RDI_U32_LineTables; +typedef struct RDI_U32_LineInfoVOffs { RDI_U32 v; } RDI_U32_LineInfoVOffs; +typedef struct RDI_U32_LineInfoLines { RDI_U32 v; } RDI_U32_LineInfoLines; +typedef struct RDI_U32_LineInfoColumns { RDI_U32 v; } RDI_U32_LineInfoColumns; +typedef struct RDI_U32_SourceLineMaps { RDI_U32 v; } RDI_U32_SourceLineMaps; +typedef struct RDI_U32_SourceLineMapNumbers { RDI_U32 v; } RDI_U32_SourceLineMapNumbers; +typedef struct RDI_U32_SourceLineMapRanges { RDI_U32 v; } RDI_U32_SourceLineMapRanges; +typedef struct RDI_U32_SourceLineMapVOffs { RDI_U32 v; } RDI_U32_SourceLineMapVOffs; +typedef struct RDI_U32_Units { RDI_U32 v; } RDI_U32_Units; +typedef struct RDI_U32_TypeNodes { RDI_U32 v; } RDI_U32_TypeNodes; +typedef struct RDI_U32_UDTs { RDI_U32 v; } RDI_U32_UDTs; +typedef struct RDI_U32_Members { RDI_U32 v; } RDI_U32_Members; +typedef struct RDI_U32_EnumMembers { RDI_U32 v; } RDI_U32_EnumMembers; +typedef struct RDI_U32_GlobalVariables { RDI_U32 v; } RDI_U32_GlobalVariables; +typedef struct RDI_U32_ThreadVariables { RDI_U32 v; } RDI_U32_ThreadVariables; +typedef struct RDI_U32_Constants { RDI_U32 v; } RDI_U32_Constants; +typedef struct RDI_U32_Procedures { RDI_U32 v; } RDI_U32_Procedures; +typedef struct RDI_U32_Scopes { RDI_U32 v; } RDI_U32_Scopes; +typedef struct RDI_U32_ScopeVOffData { RDI_U32 v; } RDI_U32_ScopeVOffData; +typedef struct RDI_U32_InlineSites { RDI_U32 v; } RDI_U32_InlineSites; +typedef struct RDI_U32_Locals { RDI_U32 v; } RDI_U32_Locals; +typedef struct RDI_U32_LocationBlocks { RDI_U32 v; } RDI_U32_LocationBlocks; +typedef struct RDI_U32_LocationData { RDI_U32 v; } RDI_U32_LocationData; +typedef struct RDI_U32_ConstantValueData { RDI_U32 v; } RDI_U32_ConstantValueData; +typedef struct RDI_U32_ConstantValueTable { RDI_U32 v; } RDI_U32_ConstantValueTable; +typedef struct RDI_U32_NameMaps { RDI_U32 v; } RDI_U32_NameMaps; +typedef struct RDI_U32_NameMapBuckets { RDI_U32 v; } RDI_U32_NameMapBuckets; +typedef struct RDI_U32_NameMapNodes { RDI_U32 v; } RDI_U32_NameMapNodes; +#else +typedef struct RDI_U32_Table { RDI_U32 v; } RDI_U32_Table; +typedef struct RDI_U64_Table { RDI_U64 v; } RDI_U64_Table; +typedef RDI_U32_Table RDI_U32_StringTable; +typedef RDI_U32_Table RDI_U32_IndexRuns; +typedef RDI_U32_Table RDI_U32_BinarySections; +typedef RDI_U32_Table RDI_U32_FilePathNodes; +typedef RDI_U32_Table RDI_U32_SourceFiles; +typedef RDI_U32_Table RDI_U32_LineTables; +typedef RDI_U32_Table RDI_U32_LineInfoVOffs; +typedef RDI_U32_Table RDI_U32_LineInfoLines; +typedef RDI_U32_Table RDI_U32_LineInfoColumns; +typedef RDI_U32_Table RDI_U32_SourceLineMaps; +typedef RDI_U32_Table RDI_U32_SourceLineMapNumbers; +typedef RDI_U32_Table RDI_U32_SourceLineMapRanges; +typedef RDI_U32_Table RDI_U32_SourceLineMapVOffs; +typedef RDI_U32_Table RDI_U32_Units; +typedef RDI_U32_Table RDI_U32_TypeNodes; +typedef RDI_U32_Table RDI_U32_UDTs; +typedef RDI_U32_Table RDI_U32_Members; +typedef RDI_U32_Table RDI_U32_EnumMembers; +typedef RDI_U32_Table RDI_U32_GlobalVariables; +typedef RDI_U32_Table RDI_U32_ThreadVariables; +typedef RDI_U32_Table RDI_U32_Constants; +typedef RDI_U32_Table RDI_U32_Procedures; +typedef RDI_U32_Table RDI_U32_Scopes; +typedef RDI_U32_Table RDI_U32_ScopeVOffData; +typedef RDI_U32_Table RDI_U32_InlineSites; +typedef RDI_U32_Table RDI_U32_Locals; +typedef RDI_U32_Table RDI_U32_LocationBlocks; +typedef RDI_U32_Table RDI_U32_LocationData; +typedef RDI_U32_Table RDI_U32_ConstantValueData; +typedef RDI_U32_Table RDI_U32_ConstantValueTable; +typedef RDI_U32_Table RDI_U32_NameMaps; +typedef RDI_U32_Table RDI_U32_NameMapBuckets; +typedef RDI_U32_Table RDI_U32_NameMapNodes; +#endif + +#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) (((decodeN) << 8) | ((popN) << 4) | ((pushN) << 0)) +#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 8) & 0xff) +#define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0xf) +#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 0) & 0xf) +#define RDI_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16)) + +typedef struct RDI_Header RDI_Header; +struct RDI_Header +{ +RDI_U64 magic; +RDI_U32 encoding_version; +RDI_U32 data_section_off; +RDI_U32 data_section_count; +}; + +typedef struct RDI_Section RDI_Section; +struct RDI_Section +{ +RDI_SectionEncoding encoding; +RDI_U32 pad; +RDI_U64 off; +RDI_U64 encoded_size; +RDI_U64 unpacked_size; +}; + +typedef struct RDI_VMapEntry RDI_VMapEntry; +struct RDI_VMapEntry +{ +RDI_U64 voff; +RDI_U64 idx; +}; + +typedef struct RDI_TopLevelInfo RDI_TopLevelInfo; +struct RDI_TopLevelInfo +{ +RDI_Arch arch; +RDI_U32 exe_name_string_idx; +RDI_U64 exe_hash; +RDI_U64 voff_max; +RDI_U32 producer_name_string_idx; +}; + +typedef struct RDI_BinarySection RDI_BinarySection; +struct RDI_BinarySection +{ +RDI_U32 name_string_idx; +RDI_BinarySectionFlags flags; +RDI_U64 voff_first; +RDI_U64 voff_opl; +RDI_U64 foff_first; +RDI_U64 foff_opl; +}; + +typedef struct RDI_FilePathNode RDI_FilePathNode; +struct RDI_FilePathNode +{ +RDI_U32 name_string_idx; +RDI_U32 parent_path_node; +RDI_U32 first_child; +RDI_U32 next_sibling; +RDI_U32 source_file_idx; +}; + +typedef struct RDI_SourceFile RDI_SourceFile; +struct RDI_SourceFile +{ +RDI_U32 file_path_node_idx; +RDI_U32 normal_full_path_string_idx; +RDI_U32 source_line_map_idx; +}; + +typedef struct RDI_Unit RDI_Unit; +struct RDI_Unit +{ +RDI_U32 unit_name_string_idx; +RDI_U32 compiler_name_string_idx; +RDI_U32 source_file_path_node; +RDI_U32 object_file_path_node; +RDI_U32 archive_file_path_node; +RDI_U32 build_path_node; +RDI_Language language; +RDI_U32 line_table_idx; +}; + +typedef struct RDI_LineTable RDI_LineTable; +struct RDI_LineTable +{ +RDI_U32 voffs_base_idx; +RDI_U32 lines_base_idx; +RDI_U32 cols_base_idx; +RDI_U32 lines_count; +RDI_U32 cols_count; +}; + +typedef struct RDI_Line RDI_Line; +struct RDI_Line +{ +RDI_U32 file_idx; +RDI_U32 line_num; +}; + +typedef struct RDI_Column RDI_Column; +struct RDI_Column +{ +RDI_U16 col_first; +RDI_U16 col_opl; +}; + +typedef struct RDI_SourceLineMap RDI_SourceLineMap; +struct RDI_SourceLineMap +{ +RDI_U32 line_count; +RDI_U32 voff_count; +RDI_U32 line_map_nums_base_idx; +RDI_U32 line_map_range_base_idx; +RDI_U32 line_map_voff_base_idx; +}; + +typedef struct RDI_TypeNode RDI_TypeNode; +struct RDI_TypeNode +{ +RDI_TypeKind kind; +RDI_U16 flags; +RDI_U32 byte_size; + + union + { + // kind is 'built-in' + struct + { + RDI_U32 name_string_idx; + } built_in; + + // kind is 'constructed' + struct + { + RDI_U32 direct_type_idx; + RDI_U32 count; + union + { + // when kind is 'Function' or 'Method' + RDI_U32 param_idx_run_first; + // when kind is 'MemberPtr' + RDI_U32 owner_type_idx; + }; + } + constructed; + + // kind is 'user defined' + struct + { + RDI_U32 name_string_idx; + RDI_U32 direct_type_idx; + RDI_U32 udt_idx; + } + user_defined; + + // (kind = Bitfield) + struct + { + RDI_U32 direct_type_idx; + RDI_U32 off; + RDI_U32 size; + } + bitfield; + } + ; +}; + +typedef struct RDI_UDT RDI_UDT; +struct RDI_UDT +{ +RDI_U32 self_type_idx; +RDI_UDTFlags flags; +RDI_U32 member_first; +RDI_U32 member_count; +RDI_U32 file_idx; +RDI_U32 line; +RDI_U32 col; +}; + +typedef struct RDI_Member RDI_Member; +struct RDI_Member +{ +RDI_MemberKind kind; +RDI_U16 pad; +RDI_U32 name_string_idx; +RDI_U32 type_idx; +RDI_U32 off; +}; + +typedef struct RDI_EnumMember RDI_EnumMember; +struct RDI_EnumMember +{ +RDI_U32 name_string_idx; +RDI_U32 pad; +RDI_U64 val; +}; + +typedef struct RDI_GlobalVariable RDI_GlobalVariable; +struct RDI_GlobalVariable +{ +RDI_U32 name_string_idx; +RDI_LinkFlags link_flags; +RDI_U64 voff; +RDI_U32 type_idx; +RDI_U32 container_idx; +}; + +typedef struct RDI_ThreadVariable RDI_ThreadVariable; +struct RDI_ThreadVariable +{ +RDI_U32 name_string_idx; +RDI_LinkFlags link_flags; +RDI_U32 tls_off; +RDI_U32 type_idx; +RDI_U32 container_idx; +}; + +typedef struct RDI_Constant RDI_Constant; +struct RDI_Constant +{ +RDI_U32 name_string_idx; +RDI_U32 type_idx; +RDI_U32 constant_value_idx; +}; + +typedef struct RDI_Procedure RDI_Procedure; +struct RDI_Procedure +{ +RDI_U32 name_string_idx; +RDI_U32 link_name_string_idx; +RDI_LinkFlags link_flags; +RDI_U32 type_idx; +RDI_U32 root_scope_idx; +RDI_U32 container_idx; +RDI_U32 frame_base_location_first; +RDI_U32 frame_base_location_opl; +}; + +typedef struct RDI_Scope RDI_Scope; +struct RDI_Scope +{ +RDI_U32 proc_idx; +RDI_U32 parent_scope_idx; +RDI_U32 first_child_scope_idx; +RDI_U32 next_sibling_scope_idx; +RDI_U32 voff_range_first; +RDI_U32 voff_range_opl; +RDI_U32 local_first; +RDI_U32 local_count; +RDI_U32 static_local_idx_run_first; +RDI_U32 static_local_count; +RDI_U32 inline_site_idx; +}; + +typedef struct RDI_InlineSite RDI_InlineSite; +struct RDI_InlineSite +{ +RDI_U32 name_string_idx; +RDI_U32 type_idx; +RDI_U32 owner_type_idx; +RDI_U32 line_table_idx; +}; + +typedef struct RDI_Local RDI_Local; +struct RDI_Local +{ +RDI_LocalKind kind; +RDI_U32 name_string_idx; +RDI_U32 type_idx; +RDI_U32 pad; +RDI_U32 location_first; +RDI_U32 location_opl; +}; + +typedef struct RDI_LocationBlock RDI_LocationBlock; +struct RDI_LocationBlock +{ +RDI_U32 scope_off_first; +RDI_U32 scope_off_opl; +RDI_U32 location_data_off; +}; + +typedef struct RDI_LocationBytecodeStream RDI_LocationBytecodeStream; +struct RDI_LocationBytecodeStream +{ +RDI_LocationKind kind; +}; + +typedef struct RDI_LocationRegPlusU16 RDI_LocationRegPlusU16; +struct RDI_LocationRegPlusU16 +{ +RDI_LocationKind kind; +RDI_RegCode reg_code; +RDI_U16 offset; +}; + +typedef struct RDI_LocationReg RDI_LocationReg; +struct RDI_LocationReg +{ +RDI_LocationKind kind; +RDI_RegCode reg_code; +}; + +typedef struct RDI_NameMap RDI_NameMap; +struct RDI_NameMap +{ +RDI_U32 bucket_base_idx; +RDI_U32 node_base_idx; +RDI_U32 bucket_count; +RDI_U32 node_count; +}; + +typedef struct RDI_NameMapBucket RDI_NameMapBucket; +struct RDI_NameMapBucket +{ +RDI_U32 first_node; +RDI_U32 node_count; +}; + +typedef struct RDI_NameMapNode RDI_NameMapNode; +struct RDI_NameMapNode +{ +RDI_U32 string_idx; +RDI_U32 match_count; +RDI_U32 match_idx_or_idx_run_first; +}; + +typedef RDI_TopLevelInfo RDI_SectionElementType_TopLevelInfo; +typedef RDI_U8 RDI_SectionElementType_StringData; +typedef RDI_U32 RDI_SectionElementType_StringTable; +typedef RDI_U32 RDI_SectionElementType_IndexRuns; +typedef RDI_BinarySection RDI_SectionElementType_BinarySections; +typedef RDI_FilePathNode RDI_SectionElementType_FilePathNodes; +typedef RDI_SourceFile RDI_SectionElementType_SourceFiles; +typedef RDI_LineTable RDI_SectionElementType_LineTables; +typedef RDI_U64 RDI_SectionElementType_LineInfoVOffs; +typedef RDI_Line RDI_SectionElementType_LineInfoLines; +typedef RDI_Column RDI_SectionElementType_LineInfoColumns; +typedef RDI_SourceLineMap RDI_SectionElementType_SourceLineMaps; +typedef RDI_U32 RDI_SectionElementType_SourceLineMapNumbers; +typedef RDI_U32 RDI_SectionElementType_SourceLineMapRanges; +typedef RDI_U64 RDI_SectionElementType_SourceLineMapVOffs; +typedef RDI_Unit RDI_SectionElementType_Units; +typedef RDI_VMapEntry RDI_SectionElementType_UnitVMap; +typedef RDI_TypeNode RDI_SectionElementType_TypeNodes; +typedef RDI_UDT RDI_SectionElementType_UDTs; +typedef RDI_Member RDI_SectionElementType_Members; +typedef RDI_EnumMember RDI_SectionElementType_EnumMembers; +typedef RDI_GlobalVariable RDI_SectionElementType_GlobalVariables; +typedef RDI_VMapEntry RDI_SectionElementType_GlobalVMap; +typedef RDI_ThreadVariable RDI_SectionElementType_ThreadVariables; +typedef RDI_Constant RDI_SectionElementType_Constants; +typedef RDI_Procedure RDI_SectionElementType_Procedures; +typedef RDI_Scope RDI_SectionElementType_Scopes; +typedef RDI_U64 RDI_SectionElementType_ScopeVOffData; +typedef RDI_VMapEntry RDI_SectionElementType_ScopeVMap; +typedef RDI_InlineSite RDI_SectionElementType_InlineSites; +typedef RDI_Local RDI_SectionElementType_Locals; +typedef RDI_LocationBlock RDI_SectionElementType_LocationBlocks; +typedef RDI_U8 RDI_SectionElementType_LocationData; +typedef RDI_U8 RDI_SectionElementType_ConstantValueData; +typedef RDI_U32 RDI_SectionElementType_ConstantValueTable; +typedef RDI_NameMap RDI_SectionElementType_NameMaps; +typedef RDI_NameMapBucket RDI_SectionElementType_NameMapBuckets; +typedef RDI_NameMapNode RDI_SectionElementType_NameMapNodes; + +RDI_PROC RDI_U64 rdi_hash(RDI_U8 *ptr, RDI_U64 size); +RDI_PROC RDI_U8 *rdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out); +RDI_PROC RDI_U32 rdi_size_from_basic_type_kind(RDI_TypeKind kind); +RDI_PROC RDI_U32 rdi_addr_size_from_arch(RDI_Arch arch); +RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out); +RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group); +RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); + +extern RDI_U16 rdi_section_element_size_table[40]; +extern RDI_U8 rdi_section_is_required_table[40]; +extern RDI_U16 rdi_eval_op_ctrlbits_table[52]; + +#endif // RDI_H diff --git a/src/lib_rdi_format/rdi_format_parse.c b/src/lib_rdi/rdi_parse.c similarity index 100% rename from src/lib_rdi_format/rdi_format_parse.c rename to src/lib_rdi/rdi_parse.c diff --git a/src/lib_rdi_format/rdi_format_parse.h b/src/lib_rdi/rdi_parse.h similarity index 96% rename from src/lib_rdi_format/rdi_format_parse.h rename to src/lib_rdi/rdi_parse.h index f8b7e096..c5267b01 100644 --- a/src/lib_rdi_format/rdi_format_parse.h +++ b/src/lib_rdi/rdi_parse.h @@ -1,233 +1,233 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////////////////////////////////////// -//~ RAD Debug Info, (R)AD(D)BG(I) Format Parsing Library -// -// Defines helper types and functions for extracting data from -// RDI files. - -//////////////////////////////////////////////////////////////// -//~ Usage Samples -// -#if 0 -// Procedure Name -> Line -{ - RDI_Parsed *rdi = ...; - char *name = "mule_main"; - RDI_Procedure *procedure = rdi_procedure_from_name_cstr(rdi, name); // 1. name -> procedure - RDI_U64 procedure_first_voff = rdi_first_voff_from_procedure(rdi, procedure); // 2. procedure -> virtual offset - RDI_Line line = rdi_line_from_voff(rdi, procedure_first_voff); // 3. virtual offset -> line - RDI_SourceFile *file = rdi_source_file_from_line(rdi, &line); // 4. line -> source file - RDI_U64 file_path_size = 0; // 5. source file -> path - RDI_U8 *file_path = rdi_normal_path_from_source_file(rdi, file, &file_path_size); - printf("%s is at %.*s:%u\n", name, (int)file_path_size, file_path, line.line_num); -} - -// Line -> Procedure Name -{ - RDI_Parsed *rdi = ...; - char *path = "c:/devel/raddebugger/src/mule/mule_main.cpp"; - RDI_U32 line_num = 2557; - RDI_SourceFile *file = rdi_source_file_from_normal_path_cstr(rdi, path); // 1. path -> source file - RDI_U64 voff = rdi_first_voff_from_source_file_line_num(rdi, file, line_num); // 2. (source file, line) -> virtual offset - RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff); // 3. virtual offset -> procedure - RDI_U64 name_size = 0; // 4. procedure -> name - RDI_U8 *name = rdi_name_from_procedure(rdi, procedure, &name_size); - printf("%s:%u is inside %.*s\n", path, line_num, (int)name_size, name); -} -#endif - -#ifndef RDI_FORMAT_PARSE_H -#define RDI_FORMAT_PARSE_H - -//////////////////////////////////////////////////////////////// -//~ Parsed Information Types - -typedef enum RDI_ParseStatus -{ - RDI_ParseStatus_Good = 0, - RDI_ParseStatus_HeaderDoesNotMatch = 1, - RDI_ParseStatus_UnsupportedVersionNumber = 2, - RDI_ParseStatus_InvalidDataSecionLayout = 3, - RDI_ParseStatus_MissingRequiredSection = 4, -} -RDI_ParseStatus; - -typedef struct RDI_Parsed RDI_Parsed; -struct RDI_Parsed -{ - RDI_U8 *raw_data; - RDI_U64 raw_data_size; - RDI_Section *sections; - RDI_U64 sections_count; -}; - -typedef struct RDI_ParsedLineTable RDI_ParsedLineTable; -struct RDI_ParsedLineTable -{ - // NOTE: Mapping VOFF -> LINE_INFO - // - // * [ voff[i], voff[i + 1] ) forms the voff range - // * for the line info at lines[i] (and cols[i] if i < col_count) - RDI_U64* voffs; // [count + 1] sorted - RDI_Line* lines; // [count] - RDI_Column* cols; // [col_count] - RDI_U64 count; - RDI_U64 col_count; -}; - -typedef struct RDI_ParsedSourceLineMap RDI_ParsedSourceLineMap; -struct RDI_ParsedSourceLineMap -{ - // NOTE: Mapping LINE_NUMBER -> VOFFs - // - // * nums[i] gives a line number - // * that line number has one or more associated voffs - // - // * to find all associated voffs for the line number nums[i] : - // * let k span over the range [ ranges[i], ranges[i + 1] ) - // * voffs[k] gives the associated voffs - RDI_U32* nums; // [count] sorted - RDI_U32* ranges; // [count + 1] - RDI_U64* voffs; // [voff_count] - RDI_U64 count; - RDI_U64 voff_count; -}; - -typedef struct RDI_ParsedNameMap RDI_ParsedNameMap; -struct RDI_ParsedNameMap -{ - RDI_NameMapBucket *buckets; - RDI_NameMapNode *nodes; - RDI_U64 bucket_count; - RDI_U64 node_count; -}; - -//////////////////////////////// -//~ Global Nils - -static union -{ - RDI_TopLevelInfo top_level_info; - RDI_BinarySection binary_section; - RDI_FilePathNode file_path_node; - RDI_SourceFile source_file; - RDI_LineTable line_table; - RDI_SourceLineMap source_line_map; - RDI_Line line; - RDI_Column column; - RDI_Unit unit; - RDI_VMapEntry vmap_entry; - RDI_TypeNode type_node; - RDI_UDT udt; - RDI_Member member; - RDI_EnumMember enum_member; - RDI_GlobalVariable global_variable; - RDI_ThreadVariable thread_variable; - RDI_Procedure procedure; - RDI_Scope scope; - RDI_U64 voff; - RDI_LocationBlock location_block; - RDI_Local local; -} -rdi_nil_element_union = {0}; -static RDI_Parsed rdi_parsed_nil = {0}; - -//////////////////////////////// -//~ Top-Level Parsing API - -RDI_PROC RDI_ParseStatus rdi_parse(RDI_U8 *data, RDI_U64 size, RDI_Parsed *out); - -//////////////////////////////// -//~ Base Parsed Info Extraction Helpers - -//- section table/element raw data extraction -RDI_PROC void *rdi_section_raw_data_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_SectionEncoding *encoding_out, RDI_U64 *size_out); -RDI_PROC void *rdi_section_raw_table_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 *count_out); -RDI_PROC void *rdi_section_raw_element_from_kind_idx(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 idx); -#define rdi_table_from_name(rdi, name, count_out) ((RDI_SectionElementType_##name *)rdi_section_raw_table_from_kind((rdi), RDI_SectionKind_##name, (count_out))) -#define rdi_element_from_name_idx(rdi, name, idx) ((RDI_SectionElementType_##name *)rdi_section_raw_element_from_kind_idx((rdi), RDI_SectionKind_##name, (idx))) - -//- info about whole parse -RDI_PROC RDI_U64 rdi_decompressed_size_from_parsed(RDI_Parsed *rdi); - -//- strings -RDI_PROC RDI_U8 *rdi_string_from_idx(RDI_Parsed *rdi, RDI_U32 idx, RDI_U64 *len_out); - -//- index runs -RDI_PROC RDI_U32 *rdi_idx_run_from_first_count(RDI_Parsed *rdi, RDI_U32 raw_first, RDI_U32 raw_count, RDI_U32 *n_out); - -//- line info -RDI_PROC void rdi_parsed_from_line_table(RDI_Parsed *rdi, RDI_LineTable *line_table, RDI_ParsedLineTable *out); -RDI_PROC RDI_U64 rdi_line_info_idx_range_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff, RDI_U64 *n_out); -RDI_PROC RDI_U64 rdi_line_info_idx_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff); -RDI_PROC void rdi_parsed_from_source_line_map(RDI_Parsed *rdi, RDI_SourceLineMap *map, RDI_ParsedSourceLineMap *out); -RDI_PROC RDI_U64 *rdi_line_voffs_from_num(RDI_ParsedSourceLineMap *map, RDI_U32 linenum, RDI_U32 *n_out); - -//- vmap lookups -RDI_PROC RDI_U64 rdi_vmap_idx_from_voff(RDI_VMapEntry *vmap, RDI_U64 vmap_count, RDI_U64 voff); - -//- name maps -RDI_PROC RDI_NameMap *rdi_name_map_from_kind(RDI_Parsed *p, RDI_NameMapKind kind); -RDI_PROC void rdi_name_map_parse(RDI_Parsed* p, RDI_NameMap *mapptr, RDI_ParsedNameMap *out); -RDI_PROC RDI_NameMapNode *rdi_name_map_lookup(RDI_Parsed *p, RDI_ParsedNameMap *map, RDI_U8 *str, RDI_U64 len); -RDI_PROC RDI_U32 *rdi_matches_from_map_node(RDI_Parsed *p, RDI_NameMapNode *node, RDI_U32 *n_out); - -//////////////////////////////// -//~ High-Level Composite Lookup Functions - -//- procedures -RDI_PROC RDI_Procedure *rdi_procedure_from_name(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size); -RDI_PROC RDI_Procedure *rdi_procedure_from_name_cstr(RDI_Parsed *rdi, char *cstr); -RDI_PROC RDI_U8 *rdi_name_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure, RDI_U64 *len_out); -RDI_PROC RDI_Scope *rdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); -RDI_PROC RDI_UDT *rdi_container_udt_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); -RDI_PROC RDI_Procedure *rdi_container_procedure_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); -RDI_PROC RDI_U64 rdi_first_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); -RDI_PROC RDI_U64 rdi_opl_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); -RDI_PROC RDI_Procedure *rdi_procedure_from_voff(RDI_Parsed *rdi, RDI_U64 voff); - -//- scopes -RDI_PROC RDI_U64 rdi_first_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); -RDI_PROC RDI_U64 rdi_opl_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); -RDI_PROC RDI_Scope *rdi_scope_from_voff(RDI_Parsed *rdi, RDI_U64 voff); -RDI_PROC RDI_Scope *rdi_parent_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); -RDI_PROC RDI_Procedure *rdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); -RDI_PROC RDI_InlineSite *rdi_inline_site_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); - -//- global variables -RDI_PROC RDI_GlobalVariable *rdi_global_variable_from_voff(RDI_Parsed *rdi, RDI_U64 voff); - -//- units -RDI_PROC RDI_Unit *rdi_unit_from_voff(RDI_Parsed *rdi, RDI_U64 voff); -RDI_PROC RDI_LineTable *rdi_line_table_from_unit(RDI_Parsed *rdi, RDI_Unit *unit); - -//- line tables -RDI_PROC RDI_Line rdi_line_from_voff(RDI_Parsed *rdi, RDI_U64 voff); -RDI_PROC RDI_Line rdi_line_from_line_table_voff(RDI_Parsed *rdi, RDI_LineTable *line_table, RDI_U64 voff); -RDI_PROC RDI_SourceFile *rdi_source_file_from_line(RDI_Parsed *rdi, RDI_Line *line); - -//- source files -RDI_PROC RDI_SourceFile *rdi_source_file_from_normal_path(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size); -RDI_PROC RDI_SourceFile *rdi_source_file_from_normal_path_cstr(RDI_Parsed *rdi, char *cstr); -RDI_PROC RDI_U8 *rdi_normal_path_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file, RDI_U64 *len_out); -RDI_PROC RDI_FilePathNode *rdi_file_path_node_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file); -RDI_PROC RDI_SourceLineMap *rdi_source_line_map_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file); -RDI_PROC RDI_U64 rdi_first_voff_from_source_file_line_num(RDI_Parsed *rdi, RDI_SourceFile *src_file, RDI_U32 line_num); - -//- source line maps -RDI_PROC RDI_U64 rdi_first_voff_from_source_line_map_num(RDI_Parsed *rdi, RDI_SourceLineMap *map, RDI_U32 line_num); - -//- file path nodes -RDI_PROC RDI_FilePathNode *rdi_parent_from_file_path_node(RDI_Parsed *rdi, RDI_FilePathNode *node); -RDI_PROC RDI_U8 *rdi_name_from_file_path_node(RDI_Parsed *rdi, RDI_FilePathNode *node, RDI_U64 *len_out); - -//////////////////////////////// -//~ Parser Helpers - -#define rdi_parse__min(a,b) (((a)<(b))?(a):(b)) -RDI_PROC RDI_U64 rdi_cstring_length(char *cstr); -RDI_PROC RDI_U64 rdi_size_from_bytecode_stream(RDI_U8 *ptr, RDI_U8 *opl); - -#endif // RDI_FORMAT_PARSE_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////////////////////////////////////// +//~ (R)AD (D)ebug (I)nfo Format Parsing Library +// +// Defines helper types and functions for extracting data from +// RDI files. + +//////////////////////////////////////////////////////////////// +//~ Usage Samples +// +#if 0 +// Procedure Name -> Line +{ + RDI_Parsed *rdi = ...; + char *name = "mule_main"; + RDI_Procedure *procedure = rdi_procedure_from_name_cstr(rdi, name); // 1. name -> procedure + RDI_U64 procedure_first_voff = rdi_first_voff_from_procedure(rdi, procedure); // 2. procedure -> virtual offset + RDI_Line line = rdi_line_from_voff(rdi, procedure_first_voff); // 3. virtual offset -> line + RDI_SourceFile *file = rdi_source_file_from_line(rdi, &line); // 4. line -> source file + RDI_U64 file_path_size = 0; // 5. source file -> path + RDI_U8 *file_path = rdi_normal_path_from_source_file(rdi, file, &file_path_size); + printf("%s is at %.*s:%u\n", name, (int)file_path_size, file_path, line.line_num); +} + +// Line -> Procedure Name +{ + RDI_Parsed *rdi = ...; + char *path = "c:/devel/raddebugger/src/mule/mule_main.cpp"; + RDI_U32 line_num = 2557; + RDI_SourceFile *file = rdi_source_file_from_normal_path_cstr(rdi, path); // 1. path -> source file + RDI_U64 voff = rdi_first_voff_from_source_file_line_num(rdi, file, line_num); // 2. (source file, line) -> virtual offset + RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff); // 3. virtual offset -> procedure + RDI_U64 name_size = 0; // 4. procedure -> name + RDI_U8 *name = rdi_name_from_procedure(rdi, procedure, &name_size); + printf("%s:%u is inside %.*s\n", path, line_num, (int)name_size, name); +} +#endif + +#ifndef RDI_PARSE_H +#define RDI_PARSE_H + +//////////////////////////////////////////////////////////////// +//~ Parsed Information Types + +typedef enum RDI_ParseStatus +{ + RDI_ParseStatus_Good = 0, + RDI_ParseStatus_HeaderDoesNotMatch = 1, + RDI_ParseStatus_UnsupportedVersionNumber = 2, + RDI_ParseStatus_InvalidDataSecionLayout = 3, + RDI_ParseStatus_MissingRequiredSection = 4, +} +RDI_ParseStatus; + +typedef struct RDI_Parsed RDI_Parsed; +struct RDI_Parsed +{ + RDI_U8 *raw_data; + RDI_U64 raw_data_size; + RDI_Section *sections; + RDI_U64 sections_count; +}; + +typedef struct RDI_ParsedLineTable RDI_ParsedLineTable; +struct RDI_ParsedLineTable +{ + // NOTE: Mapping VOFF -> LINE_INFO + // + // * [ voff[i], voff[i + 1] ) forms the voff range + // * for the line info at lines[i] (and cols[i] if i < col_count) + RDI_U64* voffs; // [count + 1] sorted + RDI_Line* lines; // [count] + RDI_Column* cols; // [col_count] + RDI_U64 count; + RDI_U64 col_count; +}; + +typedef struct RDI_ParsedSourceLineMap RDI_ParsedSourceLineMap; +struct RDI_ParsedSourceLineMap +{ + // NOTE: Mapping LINE_NUMBER -> VOFFs + // + // * nums[i] gives a line number + // * that line number has one or more associated voffs + // + // * to find all associated voffs for the line number nums[i] : + // * let k span over the range [ ranges[i], ranges[i + 1] ) + // * voffs[k] gives the associated voffs + RDI_U32* nums; // [count] sorted + RDI_U32* ranges; // [count + 1] + RDI_U64* voffs; // [voff_count] + RDI_U64 count; + RDI_U64 voff_count; +}; + +typedef struct RDI_ParsedNameMap RDI_ParsedNameMap; +struct RDI_ParsedNameMap +{ + RDI_NameMapBucket *buckets; + RDI_NameMapNode *nodes; + RDI_U64 bucket_count; + RDI_U64 node_count; +}; + +//////////////////////////////// +//~ Global Nils + +static union +{ + RDI_TopLevelInfo top_level_info; + RDI_BinarySection binary_section; + RDI_FilePathNode file_path_node; + RDI_SourceFile source_file; + RDI_LineTable line_table; + RDI_SourceLineMap source_line_map; + RDI_Line line; + RDI_Column column; + RDI_Unit unit; + RDI_VMapEntry vmap_entry; + RDI_TypeNode type_node; + RDI_UDT udt; + RDI_Member member; + RDI_EnumMember enum_member; + RDI_GlobalVariable global_variable; + RDI_ThreadVariable thread_variable; + RDI_Procedure procedure; + RDI_Scope scope; + RDI_U64 voff; + RDI_LocationBlock location_block; + RDI_Local local; +} +rdi_nil_element_union = {0}; +static RDI_Parsed rdi_parsed_nil = {0}; + +//////////////////////////////// +//~ Top-Level Parsing API + +RDI_PROC RDI_ParseStatus rdi_parse(RDI_U8 *data, RDI_U64 size, RDI_Parsed *out); + +//////////////////////////////// +//~ Base Parsed Info Extraction Helpers + +//- section table/element raw data extraction +RDI_PROC void *rdi_section_raw_data_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_SectionEncoding *encoding_out, RDI_U64 *size_out); +RDI_PROC void *rdi_section_raw_table_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 *count_out); +RDI_PROC void *rdi_section_raw_element_from_kind_idx(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 idx); +#define rdi_table_from_name(rdi, name, count_out) ((RDI_SectionElementType_##name *)rdi_section_raw_table_from_kind((rdi), RDI_SectionKind_##name, (count_out))) +#define rdi_element_from_name_idx(rdi, name, idx) ((RDI_SectionElementType_##name *)rdi_section_raw_element_from_kind_idx((rdi), RDI_SectionKind_##name, (idx))) + +//- info about whole parse +RDI_PROC RDI_U64 rdi_decompressed_size_from_parsed(RDI_Parsed *rdi); + +//- strings +RDI_PROC RDI_U8 *rdi_string_from_idx(RDI_Parsed *rdi, RDI_U32 idx, RDI_U64 *len_out); + +//- index runs +RDI_PROC RDI_U32 *rdi_idx_run_from_first_count(RDI_Parsed *rdi, RDI_U32 raw_first, RDI_U32 raw_count, RDI_U32 *n_out); + +//- line info +RDI_PROC void rdi_parsed_from_line_table(RDI_Parsed *rdi, RDI_LineTable *line_table, RDI_ParsedLineTable *out); +RDI_PROC RDI_U64 rdi_line_info_idx_range_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff, RDI_U64 *n_out); +RDI_PROC RDI_U64 rdi_line_info_idx_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff); +RDI_PROC void rdi_parsed_from_source_line_map(RDI_Parsed *rdi, RDI_SourceLineMap *map, RDI_ParsedSourceLineMap *out); +RDI_PROC RDI_U64 *rdi_line_voffs_from_num(RDI_ParsedSourceLineMap *map, RDI_U32 linenum, RDI_U32 *n_out); + +//- vmap lookups +RDI_PROC RDI_U64 rdi_vmap_idx_from_voff(RDI_VMapEntry *vmap, RDI_U64 vmap_count, RDI_U64 voff); + +//- name maps +RDI_PROC RDI_NameMap *rdi_name_map_from_kind(RDI_Parsed *p, RDI_NameMapKind kind); +RDI_PROC void rdi_name_map_parse(RDI_Parsed* p, RDI_NameMap *mapptr, RDI_ParsedNameMap *out); +RDI_PROC RDI_NameMapNode *rdi_name_map_lookup(RDI_Parsed *p, RDI_ParsedNameMap *map, RDI_U8 *str, RDI_U64 len); +RDI_PROC RDI_U32 *rdi_matches_from_map_node(RDI_Parsed *p, RDI_NameMapNode *node, RDI_U32 *n_out); + +//////////////////////////////// +//~ High-Level Composite Lookup Functions + +//- procedures +RDI_PROC RDI_Procedure *rdi_procedure_from_name(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size); +RDI_PROC RDI_Procedure *rdi_procedure_from_name_cstr(RDI_Parsed *rdi, char *cstr); +RDI_PROC RDI_U8 *rdi_name_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure, RDI_U64 *len_out); +RDI_PROC RDI_Scope *rdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); +RDI_PROC RDI_UDT *rdi_container_udt_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); +RDI_PROC RDI_Procedure *rdi_container_procedure_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); +RDI_PROC RDI_U64 rdi_first_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); +RDI_PROC RDI_U64 rdi_opl_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); +RDI_PROC RDI_Procedure *rdi_procedure_from_voff(RDI_Parsed *rdi, RDI_U64 voff); + +//- scopes +RDI_PROC RDI_U64 rdi_first_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); +RDI_PROC RDI_U64 rdi_opl_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); +RDI_PROC RDI_Scope *rdi_scope_from_voff(RDI_Parsed *rdi, RDI_U64 voff); +RDI_PROC RDI_Scope *rdi_parent_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); +RDI_PROC RDI_Procedure *rdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); +RDI_PROC RDI_InlineSite *rdi_inline_site_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); + +//- global variables +RDI_PROC RDI_GlobalVariable *rdi_global_variable_from_voff(RDI_Parsed *rdi, RDI_U64 voff); + +//- units +RDI_PROC RDI_Unit *rdi_unit_from_voff(RDI_Parsed *rdi, RDI_U64 voff); +RDI_PROC RDI_LineTable *rdi_line_table_from_unit(RDI_Parsed *rdi, RDI_Unit *unit); + +//- line tables +RDI_PROC RDI_Line rdi_line_from_voff(RDI_Parsed *rdi, RDI_U64 voff); +RDI_PROC RDI_Line rdi_line_from_line_table_voff(RDI_Parsed *rdi, RDI_LineTable *line_table, RDI_U64 voff); +RDI_PROC RDI_SourceFile *rdi_source_file_from_line(RDI_Parsed *rdi, RDI_Line *line); + +//- source files +RDI_PROC RDI_SourceFile *rdi_source_file_from_normal_path(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size); +RDI_PROC RDI_SourceFile *rdi_source_file_from_normal_path_cstr(RDI_Parsed *rdi, char *cstr); +RDI_PROC RDI_U8 *rdi_normal_path_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file, RDI_U64 *len_out); +RDI_PROC RDI_FilePathNode *rdi_file_path_node_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file); +RDI_PROC RDI_SourceLineMap *rdi_source_line_map_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file); +RDI_PROC RDI_U64 rdi_first_voff_from_source_file_line_num(RDI_Parsed *rdi, RDI_SourceFile *src_file, RDI_U32 line_num); + +//- source line maps +RDI_PROC RDI_U64 rdi_first_voff_from_source_line_map_num(RDI_Parsed *rdi, RDI_SourceLineMap *map, RDI_U32 line_num); + +//- file path nodes +RDI_PROC RDI_FilePathNode *rdi_parent_from_file_path_node(RDI_Parsed *rdi, RDI_FilePathNode *node); +RDI_PROC RDI_U8 *rdi_name_from_file_path_node(RDI_Parsed *rdi, RDI_FilePathNode *node, RDI_U64 *len_out); + +//////////////////////////////// +//~ Parser Helpers + +#define rdi_parse__min(a,b) (((a)<(b))?(a):(b)) +RDI_PROC RDI_U64 rdi_cstring_length(char *cstr); +RDI_PROC RDI_U64 rdi_size_from_bytecode_stream(RDI_U8 *ptr, RDI_U8 *opl); + +#endif // RDI_FORMAT_PARSE_H diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 10a1ab10..1dea30a5 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -63,10 +63,8 @@ // RDI #include "rdi/rdi_overrides.h" -#include "lib_rdi_format/rdi_format.h" -#include "rdi/rdi.h" -#include "lib_rdi_format/rdi_format.c" -#include "rdi/rdi.c" +#include "lib_rdi/rdi.h" +#include "lib_rdi/rdi.c" //////////////////////////////// // Code Base Extensions diff --git a/src/linker/rdi/rdi.c b/src/linker/rdi/rdi.c deleted file mode 100644 index 8b137891..00000000 --- a/src/linker/rdi/rdi.c +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/linker/rdi/rdi.h b/src/linker/rdi/rdi.h deleted file mode 100644 index 531a62b0..00000000 --- a/src/linker/rdi/rdi.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - - - diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index 85733775..193c81a5 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -19,7 +19,7 @@ #include "linker/hash_table.h" #include "os/os_inc.h" #include "async/async.h" -#include "rdi_format/rdi_format_local.h" +#include "rdi/rdi_local.h" #include "rdi_make/rdi_make_local.h" #include "coff/coff.h" #include "coff/coff_parse.h" @@ -46,7 +46,7 @@ #include "linker/hash_table.c" #include "os/os_inc.c" #include "async/async.c" -#include "rdi_format/rdi_format_local.c" +#include "rdi/rdi_local.c" #include "rdi_make/rdi_make_local.c" #include "coff/coff.c" #include "coff/coff_parse.c" diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index e9ebbaa4..0af77b13 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -211,7 +211,7 @@ #include "linker/hash_table.h" #include "os/os_inc.h" #include "async/async.h" -#include "rdi_format/rdi_format_local.h" +#include "rdi/rdi_local.h" #include "rdi_make/rdi_make_local.h" #include "mdesk/mdesk.h" #include "hash_store/hash_store.h" @@ -264,7 +264,7 @@ #include "linker/hash_table.c" #include "os/os_inc.c" #include "async/async.c" -#include "rdi_format/rdi_format_local.c" +#include "rdi/rdi_local.c" #include "rdi_make/rdi_make_local.c" #include "mdesk/mdesk.c" #include "hash_store/hash_store.c" diff --git a/src/rdi_format/rdi_format.mdesk b/src/rdi/rdi.mdesk similarity index 99% rename from src/rdi_format/rdi_format.mdesk rename to src/rdi/rdi.mdesk index a43bae13..7dcd4eb0 100644 --- a/src/rdi_format/rdi_format.mdesk +++ b/src/rdi/rdi.mdesk @@ -5,20 +5,20 @@ //~ rjf: Generated File Format @option library -@gen_folder "lib_rdi_format" -@h_name "rdi_format.h" -@c_name "rdi_format.c" +@gen_folder "lib_rdi" +@h_name "rdi.h" +@c_name "rdi.c" @h_header { "////////////////////////////////////////////////////////////////"; - "//~ RAD Debug Info, (R)AD(D)BG(I) Format Library"; + "//~ (R)AD (D)ebug (I)nfo Format Library"; "//"; "// Defines standard RDI debug information format types and"; "// functions."; ""; - "#ifndef RDI_FORMAT_H"; - "#define RDI_FORMAT_H"; + "#ifndef RDI_H"; + "#define RDI_H"; ""; "////////////////////////////////////////////////////////////////"; "//~ Overridable Procedure Decoration"; @@ -71,25 +71,25 @@ @h_footer { - "#endif // RDI_FORMAT_H"; + "#endif // RDI_H"; } @c_header { "////////////////////////////////////////////////////////////////"; - "//~ RAD Debug Info, (R)AD(D)BG(I) Format Library"; + "//~ (R)AD (D)ebug (I)nfo Format Library"; "//"; "// Defines standard RDI debug information format types and"; "// functions."; ""; - "#ifndef RDI_FORMAT_C"; - "#define RDI_FORMAT_C"; + "#ifndef RDI_C"; + "#define RDI_C"; ""; } @c_footer { - "#endif // RDI_FORMAT_C"; + "#endif // RDI_C"; } //////////////////////////////// diff --git a/src/rdi_format/rdi_format_local.c b/src/rdi/rdi_local.c similarity index 97% rename from src/rdi_format/rdi_format_local.c rename to src/rdi/rdi_local.c index 11fe38f3..166bc023 100644 --- a/src/rdi_format/rdi_format_local.c +++ b/src/rdi/rdi_local.c @@ -1,1257 +1,1257 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "lib_rdi_format/rdi_format.c" -#include "lib_rdi_format/rdi_format_parse.c" - -//////////////////////////////// -//~ rjf: RDI Decompression - -internal void -rdi_decompress_parsed(U8 *decompressed_data, U64 decompressed_size, RDI_Parsed *og_rdi) -{ - // rjf: copy header - RDI_Header *src_header = (RDI_Header *)og_rdi->raw_data; - RDI_Header *dst_header = (RDI_Header *)decompressed_data; - { - MemoryCopy(dst_header, src_header, sizeof(RDI_Header)); - } - - // rjf: copy & adjust sections for decompressed version - if(og_rdi->sections_count != 0) - { - RDI_Section *dsec_base = (RDI_Section *)(decompressed_data + dst_header->data_section_off); - MemoryCopy(dsec_base, (U8 *)og_rdi->raw_data + src_header->data_section_off, sizeof(RDI_Section) * og_rdi->sections_count); - U64 off = dst_header->data_section_off + sizeof(RDI_Section) * og_rdi->sections_count; - off += 7; - off -= off%8; - for(U64 idx = 0; idx < og_rdi->sections_count; idx += 1) - { - dsec_base[idx].encoding = RDI_SectionEncoding_Unpacked; - dsec_base[idx].off = off; - dsec_base[idx].encoded_size = dsec_base[idx].unpacked_size; - off += dsec_base[idx].unpacked_size; - off += 7; - off -= off%8; - } - } - - // rjf: decompress sections into new decompressed file buffer - if(og_rdi->sections_count != 0) - { - RDI_Section *src_first = og_rdi->sections; - RDI_Section *dst_first = (RDI_Section *)(decompressed_data + dst_header->data_section_off); - RDI_Section *src_opl = src_first + og_rdi->sections_count; - RDI_Section *dst_opl = dst_first + og_rdi->sections_count; - for(RDI_Section *src = src_first, *dst = dst_first; - src < src_opl && dst < dst_opl; - src += 1, dst += 1) - { - rr_lzb_simple_decode((U8*)og_rdi->raw_data + src->off, src->encoded_size, - decompressed_data + dst->off, dst->unpacked_size); - } - } -} - -//////////////////////////////// -//~ rjf: Lookup Helpers - -internal String8 -str8_from_rdi_string_idx(RDI_Parsed *rdi, U32 idx) -{ - String8 result = {0}; - result.str = rdi_string_from_idx(rdi, idx, &result.size); - return result; -} - -//////////////////////////////// -//~ rjf: String <=> Enum - -internal String8 -rdi_string_from_data_section_kind(Arena *arena, RDI_SectionKind v) -{ - String8 result = {0}; - switch(v) - { - default:{result = push_str8f(arena, "", v);}break; -#define X(name, lower, type) case RDI_SectionKind_##name:{result = str8_lit(#name);}break; - RDI_SectionKind_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_arch(Arena *arena, RDI_Arch v) -{ - String8 result = {0}; - switch(v) - { - default:{result = push_str8f(arena, "", v);} break; -#define X(name) case RDI_Arch_##name:{result = str8_lit(#name);} break; - RDI_Arch_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_language(Arena *arena, RDI_Language v) -{ - String8 result = {0}; - switch(v) - { - default:{result = push_str8f(arena, "", v);}break; -#define X(name) case RDI_Language_##name:{result = str8_lit(#name);}break; - RDI_Language_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_local_kind(Arena *arena, RDI_LocalKind v) -{ - String8 result = {0}; - switch(v) - { - default:{result = push_str8f(arena, "", v);}break; -#define X(name) case RDI_LocalKind_##name:{result = str8_lit(#name);}break; - RDI_LocalKind_XList -#undef X - } - return result; -} - -#if 0 -internal String8 -rdi_string_from_type_kind(Arena *arena, RDI_TypeKind v) -{ - String8 result = {0}; - switch(v) - { - default:{result = push_str8f(arena, "", v);}break; -#define X(name) case RDI_TypeKind_##name:{result = str8_lit(#name);}break; - RDI_TypeKind_XList -#undef X - } - return result; -} -#endif - -internal String8 -rdi_string_from_member_kind(Arena *arena, RDI_MemberKind v) -{ - String8 result = {0}; - switch(v) - { - default:{result = push_str8f(arena, "", v);}break; -#define X(name) case RDI_MemberKind_##name:{result = str8_lit(#name);}break; - RDI_MemberKind_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_name_map_kind(RDI_NameMapKind kind) -{ - String8 result = {0}; - switch(kind) - { - default:{}break; -#define X(name) case RDI_NameMapKind_##name:{result = str8_lit(#name);}break; - RDI_NameMapKind_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_reg_code_x86(U64 reg_code) -{ - String8 result = {0}; - switch(reg_code) - { - default:{}break; -#define X(name, value) case RDI_RegCodeX86_##name:{result = str8_lit(#name);}break; - RDI_RegCodeX86_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_reg_code_x64(U64 reg_code) -{ - String8 result = {0}; - switch(reg_code) - { - default:{}break; -#define X(name, value) case RDI_RegCodeX64_##name:{result = str8_lit(#name);}break; - RDI_RegCodeX64_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_reg_code(Arena *arena, RDI_Arch arch, U64 reg_code) -{ - String8 result = {0}; - switch(arch) - { - default: - case RDI_Arch_NULL: {result = push_str8f(arena, "??? (%llu)", reg_code);}break; - case RDI_Arch_X86: {result = rdi_string_from_reg_code_x86(reg_code);}break; - case RDI_Arch_X64: {result = rdi_string_from_reg_code_x64(reg_code);}break; - } - return result; -} - -internal String8 -rdi_string_from_eval_op(Arena *arena, RDI_EvalOp op) -{ - String8 result = {0}; - switch(op) - { - default:{result = push_str8f(arena, "%#x", op);}break; -#define X(name) case RDI_EvalOp_##name:{result = str8_lit("#name");}break; - RDI_EvalOp_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_eval_type_group(Arena *arena, RDI_EvalTypeGroup eval_type_group) -{ - String8 result = {0}; - switch(eval_type_group) - { - default:{result = push_str8f(arena, "%#x", eval_type_group);}break; -#define X(name) case RDI_EvalTypeGroup_##name:{result = str8_lit("#name");}break; - RDI_EvalTypeGroup_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_binary_section_flags(Arena *arena, RDI_BinarySectionFlags flags) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; -#define X(name) if (flags & RDI_BinarySectionFlag_##name) { flags &= ~RDI_BinarySectionFlag_##name; str8_list_push(scratch.arena, &list, str8_lit(#name)); } - RDI_BinarySectionFlags_XList; -#undef X - StringJoin join = {.sep = str8_lit("|")}; - String8 result = str8_list_join(arena, &list, &join); - if(result.size == 0) { result = str8_lit("None"); } - scratch_end(scratch); - return result; -} - -internal String8 -rdi_string_from_type_modifier_flags(Arena *arena, RDI_TypeModifierFlags flags) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; -#define X(name) if(flags & RDI_TypeModifierFlag_##name) { flags &= ~RDI_TypeModifierFlag_##name; str8_list_push(scratch.arena, &list, str8_lit(#name)); } - RDI_TypeModifierFlags_XList; -#undef X - StringJoin join = {.sep = str8_lit("|")}; - String8 result = str8_list_join(arena, &list, &join); - if(result.size == 0) { result = str8_lit("None"); } - scratch_end(scratch); - return result; -} - -internal String8 -rdi_string_from_udt_flags(Arena *arena, RDI_UDTFlags flags) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; -#define X(name) if (flags & RDI_UDTFlag_##name) { flags &= ~RDI_UDTFlag_##name; str8_list_push(scratch.arena, &list, str8_lit(#name)); } - RDI_UDTFlags_XList; -#undef X - StringJoin join = {.sep = str8_lit("|")}; - String8 result = str8_list_join(arena, &list, &join); - if(result.size == 0) { result = str8_lit("None"); } - scratch_end(scratch); - return result; -} - -internal String8 -rdi_string_from_link_flags(Arena *arena, RDI_LinkFlags flags) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; -#define X(name) if (flags & RDI_LinkFlag_##name) { flags &= ~RDI_LinkFlag_##name; str8_list_push(scratch.arena, &list, str8_lit(#name)); } - RDI_LinkFlags_XList; -#undef X - StringJoin join = {.sep = str8_lit("|")}; - String8 result = str8_list_join(arena, &list, &join); - if(result.size == 0) { result = str8_lit("None"); } - scratch_end(scratch); - return result; -} - -internal String8 -rdi_string_from_bytecode(Arena *arena, RDI_Arch arch, String8 bc) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List fmt = {0}; - for(U64 cursor = 0; cursor < bc.size; ) - { - RDI_EvalOp op = RDI_EvalOp_Stop; - cursor += str8_deserial_read_struct(bc, cursor, &op); - - U16 ctrlbits = rdi_eval_op_ctrlbits_table[op]; - U32 imm_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); - - String8 imm = {0}; - cursor += str8_deserial_read_block(bc, cursor, imm_size, &imm); - if (imm.size != imm_size) { - str8_list_pushf(scratch.arena, &fmt, "(ERROR: not enough bytes to read immediate)"); - break; - } - - String8 imm_fmt = {0}; - switch (op) { - case RDI_EvalOp_Stop: goto exit; - case RDI_EvalOp_Noop: break; - case RDI_EvalOp_Cond: break; - case RDI_EvalOp_Skip: { - imm_fmt = push_str8f(scratch.arena, "%u", *(U16 *)imm.str); - } break; - case RDI_EvalOp_MemRead: { - imm_fmt = push_str8f(scratch.arena, "%u", *(U8 *)imm.str); - } break; - case RDI_EvalOp_RegRead: { - U32 regread = *(U32 *)imm.str; - RDI_RegCode reg_code = Extract8(regread, 0); - U8 byte_size = Extract8(regread, 1); - U8 byte_off = Extract8(regread, 2); - String8 reg_str = rdi_string_from_reg_code(scratch.arena, arch, reg_code); - imm_fmt = push_str8f(scratch.arena, "%S+%I64u, Size: %u", reg_str, byte_off, byte_size); - } break; - case RDI_EvalOp_RegReadDyn: break; - case RDI_EvalOp_FrameOff: { - imm_fmt = push_str8f(scratch.arena, "%+lld", *(S64 *)imm.str); - } break; - case RDI_EvalOp_ModuleOff: { - imm_fmt = push_str8f(scratch.arena, "%u", *(U32 *)imm.str); - } break; - case RDI_EvalOp_TLSOff: { - imm_fmt = push_str8f(scratch.arena, "%u", *(U32 *)imm.str); - } break; - case RDI_EvalOp_ConstU8: { - imm_fmt = push_str8f(scratch.arena, "%u", *(U8 *)imm.str); - } break; - case RDI_EvalOp_ConstU16: { - imm_fmt = push_str8f(scratch.arena, "%u", *(U16 *)imm.str); - } break; - case RDI_EvalOp_ConstU32: { - imm_fmt = push_str8f(scratch.arena, "%u", *(U32 *)imm.str); - } break; - case RDI_EvalOp_ConstU64: { - imm_fmt = push_str8f(scratch.arena, "%llu", *(U64 *)imm.str); - } break; - case RDI_EvalOp_ConstU128: { - imm_fmt = push_str8f(scratch.arena, "Lo: %llu, Hi: %llu", *(U64 *)imm.str, *((U64 *)imm.str + 1)); - } break; - case RDI_EvalOp_ConstString: { - U8 size = *(U8 *)imm.str; - String8 string = {0}; - cursor += str8_deserial_read_block(bc, cursor, size, &string); - - imm_fmt = push_str8f(scratch.arena, "(%u) \"%S\"", size, string); - } break; - case RDI_EvalOp_Abs: - case RDI_EvalOp_Neg: - case RDI_EvalOp_Add: - case RDI_EvalOp_Sub: - case RDI_EvalOp_Mul: - case RDI_EvalOp_Div: - case RDI_EvalOp_Mod: - case RDI_EvalOp_LShift: - case RDI_EvalOp_RShift: - case RDI_EvalOp_BitAnd: - case RDI_EvalOp_BitOr: - case RDI_EvalOp_BitXor: - case RDI_EvalOp_BitNot: - case RDI_EvalOp_LogAnd: - case RDI_EvalOp_LogOr: - case RDI_EvalOp_LogNot: - case RDI_EvalOp_EqEq: - case RDI_EvalOp_NtEq: - case RDI_EvalOp_LsEq: - case RDI_EvalOp_GrEq: - case RDI_EvalOp_Less: - case RDI_EvalOp_Grtr: { - U8 eval_type_group = *(U8 *)imm.str; - imm_fmt = rdi_string_from_eval_type_group(scratch.arena, eval_type_group); - } break; - case RDI_EvalOp_Trunc: - case RDI_EvalOp_TruncSigned: { - U8 trunc = *(U8 *)imm.str; - imm_fmt = push_str8f(scratch.arena, "%u", trunc); - } break; - case RDI_EvalOp_Convert: { - U16 convert = *(U16 *)imm.str; - U8 in = Extract8(convert, 0); - U8 out = Extract8(convert, 1); - String8 in_str = rdi_string_from_eval_type_group(scratch.arena, in); - String8 out_str = rdi_string_from_eval_type_group(scratch.arena, out); - imm_fmt = push_str8f(scratch.arena, "in: %S out: %S", in_str, out_str); - } break; - case RDI_EvalOp_Pick: { - U8 pick = *(U8 *)imm.str; - imm_fmt = push_str8f(scratch.arena, "%u", pick); - } break; - case RDI_EvalOp_Pop: break; - case RDI_EvalOp_Insert: { - U8 insert = *(U8 *)imm.str; - imm_fmt = push_str8f(scratch.arena, "%u", insert); - } break; - case RDI_EvalOp_ValueRead: { - U8 bytes_to_read = *(U8 *)imm.str; - imm_fmt = push_str8f(scratch.arena, "%u", bytes_to_read); - } break; - case RDI_EvalOp_ByteSwap: { - U8 byte_size = *(U8 *)imm.str; - imm_fmt = push_str8f(scratch.arena, "%u", byte_size); - } break; - case RDI_EvalOp_CallSiteValue: { - U32 call_site_bc_size = *(U32 *)imm.str; - String8 call_site_bc = {0}; - cursor += str8_deserial_read_block(bc, cursor, call_site_bc_size, &call_site_bc); - - String8 call_site_str = rdi_string_from_bytecode(scratch.arena, arch, call_site_bc); - imm_fmt = push_str8f(scratch.arena, "%S", call_site_str); - } break; - case RDI_EvalOp_PartialValue: { - U32 partial_value_size = *(U32 *)imm.str; - imm_fmt = push_str8f(scratch.arena, "%u", partial_value_size); - } break; - case RDI_EvalOp_PartialValueBit: { - U64 partial_value = *(U64 *)imm.str; - U32 bit_size = Extract32(partial_value, 0); - U32 bit_off = Extract32(partial_value, 1); - imm_fmt = push_str8f(scratch.arena, "Off: %u, Size: %u", bit_size, bit_off); - } break; - } - - String8 op_str = rdi_string_from_eval_op(scratch.arena, op); - if (imm_fmt.size) { - str8_list_pushf(scratch.arena, &fmt, "RDI_EvalOp_%S(%S)", op_str, imm_fmt); - } else { - str8_list_pushf(scratch.arena, &fmt, "RDI_EvalOp_%S", op_str); - } - } - exit:; - - String8 result = str8_list_join(arena, &fmt, &(StringJoin){.sep = str8_lit(", ")}); - - scratch_end(scratch); - return result; -} - -internal String8List -rdi_strings_from_locations(Arena *arena, RDI_Parsed *rdi, RDI_Arch arch, Rng1U64 location_block_range) -{ - String8List strings = {0}; - Temp scratch = scratch_begin(&arena, 1); - U64 location_block_count = 0; - U64 location_data_size = 0; - RDI_LocationBlock *location_block_array = rdi_table_from_name(rdi, LocationBlocks, &location_block_count); - RDI_U8 *location_data = rdi_table_from_name(rdi, LocationData, &location_data_size); - Rng1U64 location_block_range_clamped = r1u64(ClampTop(location_block_range.min, location_block_count), - ClampTop(location_block_range.max, location_block_count)); - for(U64 block_idx = location_block_range_clamped.min; - block_idx < location_block_range_clamped.max; - block_idx +=1) - { - String8 qualifier = {0}; - String8 location_info = {0}; - RDI_LocationBlock *block_ptr = &location_block_array[block_idx]; - if(block_ptr->scope_off_first == 0 && block_ptr->scope_off_opl == max_U32) - { - qualifier = str8_lit("*always*"); - } - else - { - qualifier = push_str8f(scratch.arena, "[%#08x, %#08x): ", block_ptr->scope_off_first, block_ptr->scope_off_opl); - } - if(block_ptr->location_data_off >= location_data_size) - { - location_info = push_str8f(scratch.arena, "", block_ptr->location_data_off); - } - else - { - U8 *loc_data_opl = location_data + location_data_size; - U8 *loc_base_ptr = location_data + block_ptr->location_data_off; - RDI_LocationKind kind = *(RDI_LocationKind *)loc_base_ptr; - switch(kind) - { - default: - { - location_info = push_str8f(scratch.arena, "\?\?\? (%u)", kind); - }break; - case RDI_LocationKind_AddrBytecodeStream: - { - String8 bc = str8_range(loc_base_ptr + 1, loc_data_opl); - String8 bc_str = rdi_string_from_bytecode(scratch.arena, arch, bc); - location_info = push_str8f(scratch.arena, "AddrBytecodeStream(%S)", bc_str); - }break; - case RDI_LocationKind_ValBytecodeStream: - { - String8 bc = str8_range(loc_base_ptr + 1, loc_data_opl); - String8 bc_str = rdi_string_from_bytecode(scratch.arena, arch, bc); - location_info = push_str8f(scratch.arena, "ValBytecodeStream(%S)", bc_str); - }break; - case RDI_LocationKind_AddrRegPlusU16: - { - if(loc_base_ptr + sizeof(RDI_LocationRegPlusU16) > loc_data_opl) - { - location_info = push_str8f(scratch.arena, "AddrRegPlusU16(\?\?\?)"); - } - else - { - RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16*)loc_base_ptr; - location_info = push_str8f(scratch.arena, "AddrRegPlusU16(reg: %S, off: %u)", rdi_string_from_reg_code(scratch.arena, arch, loc->reg_code), loc->offset); - } - }break; - case RDI_LocationKind_AddrAddrRegPlusU16: - { - if(loc_base_ptr + sizeof(RDI_LocationRegPlusU16) > loc_data_opl) - { - location_info = push_str8f(scratch.arena, "AddrAddrRegPlusU16(\?\?\?)"); - } - else - { - RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16 *)loc_base_ptr; - location_info = push_str8f(scratch.arena, "AddrAddrRegisterPlusU16(reg: %S, off: %u)", rdi_string_from_reg_code(scratch.arena, arch, loc->reg_code), loc->offset); - } - }break; - case RDI_LocationKind_ValReg: - { - if(loc_base_ptr + sizeof(RDI_LocationReg) > loc_data_opl) - { - location_info = push_str8f(scratch.arena, "ValReg(\?\?\?)"); - } - else - { - RDI_LocationReg *loc = (RDI_LocationReg*)loc_base_ptr; - location_info = push_str8f(scratch.arena, "ValReg(reg: %S)", rdi_string_from_reg_code(scratch.arena, arch, loc->reg_code)); - } - } break; - } - } - str8_list_pushf(arena, &strings, "%S: %S", qualifier, location_info); - } - scratch_end(scratch); - return strings; -} - -//////////////////////////////// -//~ rjf: RDI Dumping - -internal String8List -rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags flags) -{ - String8List strings = {0}; - String8 indent = str8_lit(" "); -#define dump(str) str8_list_push(arena, &strings, (str)) -#define dumpf(...) str8_list_pushf(arena, &strings, __VA_ARGS__) -#define DumpSubset(name) if(flags & RDI_DumpSubsetFlag_##name) DeferLoop(dumpf("# %S\n\n", rdi_name_title_from_dump_subset_table[RDI_DumpSubset_##name]), dump(str8_lit("\n"))) - - ////////////////////////////// - //- rjf: dump data sections - // - DumpSubset(DataSections) - { - for EachIndex(idx, rdi->sections_count) - { - Temp scratch = scratch_begin(&arena, 1); - RDI_SectionKind kind = (RDI_SectionKind)idx; - RDI_Section *section = &rdi->sections[idx]; - String8 kind_str = rdi_string_from_data_section_kind(scratch.arena, kind); - dumpf("data_section[%5llu] = {%#08llx, %7u, %7u}, %S\n", idx, section->off, section->encoded_size, section->unpacked_size, kind_str); - scratch_end(scratch); - } - } - - ////////////////////////////// - //- rjf: dump top-level-info - // - DumpSubset(TopLevelInfo) - { - RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); - Temp scratch = scratch_begin(&arena, 1); - dumpf("arch =%S\n", rdi_string_from_arch(scratch.arena, tli->arch)); - dumpf("exe_name ='%S'\n", str8_from_rdi_string_idx(rdi, tli->exe_name_string_idx)); - dumpf("voff_max =%#08llx\n", tli->voff_max); - dumpf("producer_name='%S'\n", str8_from_rdi_string_idx(rdi, tli->producer_name_string_idx)); - scratch_end(scratch); - } - - ////////////////////////////// - //- rjf: dump binary sections - // - DumpSubset(BinarySections) - { - U64 count = 0; - RDI_BinarySection *v = rdi_table_from_name(rdi, BinarySections, &count); - for EachIndex(idx, count) - { - Temp scratch = scratch_begin(&arena, 1); - RDI_BinarySection *bin_section = &v[idx]; - dumpf("binary_section[%I64u]:\n", idx); - dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, bin_section->name_string_idx)); - dumpf(" flags =%S\n", rdi_string_from_binary_section_flags(scratch.arena, bin_section->flags)); - dumpf(" voff_first=%#08x\n", bin_section->voff_first); - dumpf(" voff_opl =%#08x\n", bin_section->voff_opl); - dumpf(" foff_first=%#08x\n", bin_section->foff_first); - dumpf(" foff_opl =%#08x\n", bin_section->foff_opl); - scratch_end(scratch); - } - } - - ////////////////////////////// - //- rjf: dump file paths - // - DumpSubset(FilePaths) - { - U64 count = 0; - RDI_FilePathNode *v = rdi_table_from_name(rdi, FilePathNodes, &count); - RDI_FilePathNode *nil = &v[0]; - for EachIndex(idx, count) - { - RDI_FilePathNode *root = &v[idx]; - if(root->parent_path_node != 0) { continue; } - S64 depth = 0; - for(RDI_FilePathNode *n = root, *rec_next = nil; n != nil; n = rec_next) - { - // rjf: dump - if(n->source_file_idx == 0) - { - dumpf("%.*s[%I64u] '%S'\n", depth*2, indent.str, (U64)(n - v), str8_from_rdi_string_idx(rdi, n->name_string_idx)); - } - else - { - dumpf("%.*s[%I64u] '%S': source_file=%u\n", depth*2, indent.str, (U64)(n - v), str8_from_rdi_string_idx(rdi, n->name_string_idx), n->source_file_idx); - } - - // rjf: find next node - rec_next = nil; - if(n->first_child) - { - rec_next = rdi_element_from_name_idx(rdi, FilePathNodes, n->first_child); - depth += 1; - } - else for(RDI_FilePathNode *p = n; - p != nil && p != root; - p = rdi_element_from_name_idx(rdi, FilePathNodes, p->parent_path_node), depth -= 1) - { - if(p->next_sibling) - { - rec_next = rdi_element_from_name_idx(rdi, FilePathNodes, p->next_sibling); - break; - } - } - } - } - } - - ////////////////////////////// - //- rjf: dump source files - // - DumpSubset(SourceFiles) - { - U64 source_file_count = 0; - RDI_SourceFile *source_file_array = rdi_table_from_name(rdi, SourceFiles, &source_file_count); - for(U64 i = 0; i < source_file_count; ++i) - { - RDI_SourceFile *source_file = &source_file_array[i]; - dumpf("source_file[%4llu] = { file_path_node_idx = %4u, source_line_map = %4u, path = '%S' }\n", - i, - source_file->file_path_node_idx, - source_file->source_line_map_idx, - str8_from_rdi_string_idx(rdi, source_file->normal_full_path_string_idx)); - } - } - - ////////////////////////////// - //- rjf: dump units - // - DumpSubset(Units) - { - U64 count = 0; - RDI_Unit *v = rdi_table_from_name(rdi, Units, &count); - for EachIndex(idx, count) - { - RDI_Unit *unit = &v[idx]; - Temp scratch = scratch_begin(&arena, 1); - dumpf("unit[%I64u]:\n", idx); - dumpf(" unit_name ='%S'\n", str8_from_rdi_string_idx(rdi, unit->unit_name_string_idx)); - dumpf(" compiler_name ='%S'\n", str8_from_rdi_string_idx(rdi, unit->compiler_name_string_idx)); - dumpf(" source_file_path =%u\n", unit->source_file_path_node); - dumpf(" object_file_path =%u\n", unit->object_file_path_node); - dumpf(" archive_file_path=%u\n", unit->archive_file_path_node); - dumpf(" build_path =%u\n", unit->build_path_node); - dumpf(" language =%S\n", rdi_string_from_language(scratch.arena, unit->language)); - dumpf(" line_table_idx =%u\n", unit->line_table_idx); - scratch_end(scratch); - } - } - - ////////////////////////////// - //- rjf: dump unit vmap - // - DumpSubset(UnitVMap) - { - U64 count = 0; - RDI_VMapEntry *v = rdi_table_from_name(rdi, UnitVMap, &count); - for EachIndex(idx, count) - { - dumpf("%I64x -> #%I64u\n", v[idx].voff, v[idx].idx); - } - } - - ////////////////////////////// - //- rjf: dump line tables - // - DumpSubset(LineTables) - { - U64 count = 0; - RDI_LineTable *v = rdi_table_from_name(rdi, LineTables, &count); - for EachIndex(idx, count) - { - RDI_LineTable *line_table = &v[idx]; - RDI_ParsedLineTable parsed_line_table = {0}; - rdi_parsed_from_line_table(rdi, line_table, &parsed_line_table); - dumpf("line_table[%I64u]:\n", idx); - for EachIndex(line_idx, parsed_line_table.count) - { - U64 first = parsed_line_table.voffs[line_idx]; - U64 opl = parsed_line_table.voffs[line_idx + 1]; - RDI_Line *line = parsed_line_table.lines + line_idx; - RDI_Column *col = 0; - if(line_idx < parsed_line_table.col_count) - { - col = parsed_line_table.cols + line_idx; - } - if(col == 0) - { - dumpf(" [0x%08I64x,0x%08I64x) file=%u; line=%u\n", first, opl, line->file_idx, line->line_num); - } - else - { - dumpf(" [0x%08I64x,0x%08I64x) file=%u; line=%u; columns=[%u,%u)\n", first, opl, line->file_idx, line->line_num, col->col_first, col->col_opl); - } - } - } - } - - ////////////////////////////// - //- rjf: dump source line maps - // - DumpSubset(SourceLineMaps) - { - U64 count = 0; - RDI_SourceLineMap *v = rdi_table_from_name(rdi, SourceLineMaps, &count); - for EachIndex(idx, count) - { - Temp scratch = scratch_begin(&arena, 1); - RDI_ParsedSourceLineMap line_map = {0}; - rdi_parsed_from_source_line_map(rdi, &v[idx], &line_map); - dumpf("source_line_map[%I64u]:\n", idx); - for EachIndex(line_num_idx, line_map.count) - { - Temp temp = temp_begin(scratch.arena); - String8List list = {0}; - U32 voff_lo = line_map.ranges[line_num_idx]; - U32 voff_hi = ClampTop(line_map.ranges[line_num_idx + 1], line_map.voff_count); - for(U64 voff_idx = voff_lo; voff_idx < voff_hi; voff_idx += 1) - { - str8_list_pushf(temp.arena, &list, "%#llx", line_map.voffs[voff_idx]); - } - String8 voffs_string = str8_list_join(temp.arena, &list, &(StringJoin){.sep = str8_lit(", ")}); - dumpf(" %u: %S\n", line_map.nums[line_num_idx], voffs_string); - temp_end(temp); - } - scratch_end(scratch); - } - } - - ////////////////////////////// - //- rjf: dump type nodes - // - DumpSubset(TypeNodes) - { - U64 count = 0; - RDI_TypeNode *v = rdi_table_from_name(rdi, TypeNodes, &count); - for EachIndex(idx, count) - { - Temp scratch = scratch_begin(&arena, 1); - RDI_TypeNode *type = &v[idx]; - String8 type_kind_str = {0}; - type_kind_str.str = rdi_string_from_type_kind(type->kind, &type_kind_str.size); - dumpf("type[%I64u]:\n", idx); - dumpf(" kind =%S\n", type_kind_str); - if(type->kind == RDI_TypeKind_Modifier) - { - dumpf(" flags =%S\n", rdi_string_from_type_modifier_flags(scratch.arena, type->flags)); - } - else if(type->flags != 0) - { - dumpf(" flags=%#x (missing stringizer path)\n", type->flags); - } - dumpf(" byte_size =%u\n", type->byte_size); - if(RDI_TypeKind_FirstBuiltIn <= type->kind && type->kind <= RDI_TypeKind_LastBuiltIn) - { - dumpf(" built_in.name ='%S'\n", str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx)); - } - else if(type->kind == RDI_TypeKind_Array) - { - dumpf(" constructed.direct_type =%u\n", type->constructed.direct_type_idx); - dumpf(" constructed.array_count =%u\n", type->constructed.count); - } - else if(type->kind == RDI_TypeKind_Function) - { - U32 param_idx_count = 0; - U32 *param_idx_array = rdi_idx_run_from_first_count(rdi, type->constructed.param_idx_run_first, type->constructed.count, ¶m_idx_count); - String8List param_idx_strings = {0}; - for(U32 param_idx = 0; param_idx < param_idx_count; param_idx += 1) - { - str8_list_pushf(scratch.arena, ¶m_idx_strings, "%u", param_idx_array[param_idx]); - } - String8 param_idx_str = str8_list_join(scratch.arena, ¶m_idx_strings, &(StringJoin){.pre = str8_lit("["), .sep = str8_lit(", "), .post = str8_lit("]")}); - dumpf(" constructed.params =%S\n", param_idx_str); - dumpf(" return_type =%u\n", type->constructed.direct_type_idx); - } - else if(type->kind == RDI_TypeKind_Method) - { - U32 param_idx_count = 0; - U32 *param_idx_array = rdi_idx_run_from_first_count(rdi, type->constructed.param_idx_run_first, type->constructed.count, ¶m_idx_count); - String8 this_type_str = str8_lit("\?\?\?"); - if(param_idx_count > 0) - { - this_type_str = push_str8f(scratch.arena, "%u", param_idx_array[0]); - param_idx_count -= 1; - param_idx_array += 1; - } - String8List param_idx_strings = {0}; - for(U32 param_idx = 0; param_idx < param_idx_count; param_idx += 1) - { - str8_list_pushf(scratch.arena, ¶m_idx_strings, "%u", param_idx_array[param_idx]); - } - String8 param_idx_str = str8_list_join(scratch.arena, ¶m_idx_strings, &(StringJoin){.pre = str8_lit("["), .sep = str8_lit(", "), .post = str8_lit("]")}); - dumpf(" constructed.this_type =%S\n", this_type_str); - dumpf(" constructed.params =%S\n", param_idx_str); - dumpf(" return_type =%u\n", type->constructed.direct_type_idx); - } - else if(RDI_TypeKind_FirstConstructed <= type->kind && type->kind <= RDI_TypeKind_LastConstructed) - { - dumpf(" constructed.direct_type =%u\n", type->constructed.direct_type_idx); - } - else if(RDI_TypeKind_FirstUserDefined <= type->kind && type->kind <= RDI_TypeKind_LastUserDefined) - { - dumpf(" user_defined.name ='%S'\n", str8_from_rdi_string_idx(rdi, type->user_defined.name_string_idx)); - dumpf(" user_defined.direct_type=%u\n", type->user_defined.direct_type_idx); - dumpf(" user_defined.udt =%u\n", type->user_defined.udt_idx); - } - else if(type->kind == RDI_TypeKind_Bitfield) - { - dumpf(" bitfield.off =%u\n", type->bitfield.off); - dumpf(" bitfield.size =%u\n", type->bitfield.size); - } - scratch_end(scratch); - } - } - - ////////////////////////////// - //- rjf: dump user defined types - // - DumpSubset(UserDefinedTypes) - { - U64 count = 0; - RDI_UDT *v = rdi_table_from_name(rdi, UDTs, &count); - U64 all_members_count = 0; - RDI_Member *all_members = rdi_table_from_name(rdi, Members, &all_members_count); - U64 all_enum_members_count = 0; - RDI_EnumMember *all_enum_members = rdi_table_from_name(rdi, EnumMembers, &all_enum_members_count); - for EachIndex(idx, count) - { - RDI_UDT *udt = &v[idx]; - Temp scratch = scratch_begin(&arena, 1); - dumpf("udt[%I64u]:\n", idx); - dumpf(" self_type=%u\n", udt->self_type_idx); - dumpf(" flags =%S\n", rdi_string_from_udt_flags(scratch.arena, udt->flags)); - if(udt->file_idx != 0) - { - dumpf(" loc ={file=%u; line=%u; col=%u}\n", udt->file_idx, udt->line, udt->col); - } - if(udt->flags & RDI_UDTFlag_EnumMembers) - { - U32 member_hi = ClampTop(udt->member_first + udt->member_count, all_enum_members_count); - U32 member_lo = ClampTop(udt->member_first, member_hi); - if(member_lo < member_hi) - { - dumpf(" enum_members=\n"); - dumpf(" {\n"); - for(U32 enum_member_idx = member_lo; enum_member_idx < member_hi; enum_member_idx += 1) - { - RDI_EnumMember *enum_member = &all_enum_members[enum_member_idx]; - dumpf(" { %llu, '%S' }\n", enum_member->val, str8_from_rdi_string_idx(rdi, enum_member->name_string_idx)); - } - dumpf(" }\n"); - } - } - else - { - U32 member_hi = ClampTop(udt->member_first + udt->member_count, all_members_count); - U32 member_lo = ClampTop(udt->member_first, member_hi); - if(member_lo < member_hi) - { - dumpf(" members=\n"); - dumpf(" {\n"); - for(U32 member_idx = member_lo; member_idx < member_hi; member_idx += 1) - { - RDI_Member *member = &all_members[member_idx]; - String8 kind_str = rdi_string_from_member_kind(scratch.arena, member->kind); - String8 name_str = str8_from_rdi_string_idx(rdi, member->name_string_idx); - dumpf(" { kind=%S, type=%u, off=%u, name='%S' }\n", kind_str, member->type_idx, member->off, name_str); - } - dumpf(" }\n"); - } - } - scratch_end(scratch); - } - } - - ////////////////////////////// - //- rjf: dump global variables - // - DumpSubset(GlobalVariables) - { - U64 count = 0; - RDI_GlobalVariable *v = rdi_table_from_name(rdi, GlobalVariables, &count); - for EachIndex(idx, count) - { - RDI_GlobalVariable *gvar = &v[idx]; - Temp scratch = scratch_begin(&arena, 1); - dumpf("global_variable[%I64u]:\n", idx); - dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, gvar->name_string_idx)); - dumpf(" link_flags =%S\n", rdi_string_from_link_flags(scratch.arena, gvar->link_flags)); - dumpf(" voff =%#08x\n", gvar->voff); - dumpf(" type_idx =%u\n", gvar->type_idx); - dumpf(" container_idx=%u\n", gvar->container_idx); - scratch_end(scratch); - } - } - - ////////////////////////////// - //- rjf: dump global variables vmap - // - DumpSubset(GlobalVariablesVMap) - { - U64 count = 0; - RDI_VMapEntry *v = rdi_table_from_name(rdi, GlobalVMap, &count); - for EachIndex(idx, count) - { - dumpf("%I64x -> #%I64u\n", v[idx].voff, v[idx].idx); - } - } - - ////////////////////////////// - //- rjf: dump thread variables - // - DumpSubset(ThreadVariables) - { - U64 count = 0; - RDI_ThreadVariable *v = rdi_table_from_name(rdi, ThreadVariables, &count); - for EachIndex(idx, count) - { - RDI_ThreadVariable *tvar = &v[idx]; - Temp scratch = scratch_begin(&arena, 1); - dumpf("thread_variable[%I64u]:\n", idx); - dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, tvar->name_string_idx)); - dumpf(" link_flags =%S\n", rdi_string_from_link_flags(scratch.arena, tvar->link_flags)); - dumpf(" tls_off =%#08x\n", tvar->tls_off); - dumpf(" type_idx =%u\n", tvar->type_idx); - dumpf(" container_idx=%u\n", tvar->container_idx); - scratch_end(scratch); - } - } - - ////////////////////////////// - //- rjf: dump constants - // - DumpSubset(Constants) - { - U64 count = 0; - RDI_Constant *v = rdi_table_from_name(rdi, Constants, &count); - for EachIndex(idx, count) - { - RDI_Constant *cnst = &v[idx]; - dumpf("constant[%I64u]:\n", idx); - dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, cnst->name_string_idx)); - dumpf(" type_idx ='%u'\n", cnst->type_idx); - } - } - - ////////////////////////////// - //- rjf: dump procedures - // - DumpSubset(Procedures) - { - RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); - U64 count = 0; - RDI_Procedure *v = rdi_table_from_name(rdi, Procedures, &count); - for EachIndex(idx, count) - { - RDI_Procedure *proc = &v[idx]; - Temp scratch = scratch_begin(&arena, 1); - String8List frame_base_location_strings = rdi_strings_from_locations(scratch.arena, rdi, tli->arch, r1u64(proc->frame_base_location_first, proc->frame_base_location_opl)); - dumpf("procedure[%I64u]:\n", idx); - dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, proc->name_string_idx)); - dumpf(" link_name ='%S'\n", str8_from_rdi_string_idx(rdi, proc->link_name_string_idx)); - dumpf(" link_flags =%S\n", rdi_string_from_link_flags(scratch.arena, proc->link_flags)); - dumpf(" type_idx =%u\n", proc->type_idx); - dumpf(" root_scope_idx =%u\n", proc->root_scope_idx); - dumpf(" container_idx =%u\n", proc->container_idx); - dumpf(" frame_base (first=%u, opl=%u)=\n", proc->frame_base_location_first, proc->frame_base_location_opl); - dumpf(" {\n"); - for(String8Node *n = frame_base_location_strings.first; n != 0; n = n->next) - { - dumpf(" %S\n", n->string); - } - dumpf(" }\n"); - scratch_end(scratch); - } - } - - ////////////////////////////// - //- rjf: dump scopes - // - DumpSubset(Scopes) - { - RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); - U64 scope_voffs_count = 0; - U64 *scope_voffs = rdi_table_from_name(rdi, ScopeVOffData, &scope_voffs_count); - U64 locals_count = 0; - RDI_Local *locals = rdi_table_from_name(rdi, Locals, &locals_count); - U64 count = 0; - RDI_Scope *v = rdi_table_from_name(rdi, Scopes, &count); - RDI_Scope *nil = &v[0]; - for EachIndex(idx, count) - { - if(v[idx].parent_scope_idx != 0) { continue; } - RDI_Scope *root = &v[idx]; - S64 depth = 0; - for(RDI_Scope *scope = root, *rec_next = nil; scope != nil; scope = rec_next) - { - // rjf: scope list(voff_range) => string - String8 voff_range_list_string = {0}; - { - U32 voff_range_lo = ClampTop(scope->voff_range_first, scope_voffs_count); - U32 voff_range_hi = ClampTop(scope->voff_range_opl, scope_voffs_count); - U32 voff_range_count = (voff_range_hi - voff_range_lo); - U64 *voff_ptr = scope_voffs + voff_range_lo; - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - for(U64 i = 0; i+2 <= voff_range_count; i += 2) - { - str8_list_pushf(scratch.arena, &list, "[%#llx, %#llx)", voff_ptr[i+0], voff_ptr[i+1]); - } - voff_range_list_string = str8_list_join(arena, &list, &(StringJoin){.sep = str8_lit(", ")}); - scratch_end(scratch); - } - - // rjf: scope procedure -> name - String8 procedure_name = str8_from_rdi_string_idx(rdi, rdi_element_from_name_idx(rdi, Procedures, scope->proc_idx)->name_string_idx); - if(procedure_name.size == 0) - { - procedure_name = str8_lit("???"); - } - - // rjf: scope inline site -> name - String8 inline_site_name = str8_from_rdi_string_idx(rdi, rdi_element_from_name_idx(rdi, InlineSites, scope->inline_site_idx)->name_string_idx); - if(inline_site_name.size == 0) - { - inline_site_name = str8_lit("???"); - } - - // rjf: dump - dumpf("%.*sscope[%I64u]:\n", depth*2, indent.str, (U64)(scope - v)); - dumpf("%.*s{\n", depth*2, indent.str); - dumpf("%.*s proc_idx =%u ('%S')\n", depth*2, indent.str, scope->proc_idx, procedure_name); - dumpf("%.*s first_child_scope_idx =%u\n", depth*2, indent.str, scope->first_child_scope_idx); - dumpf("%.*s next_sibling_scope_idx=%u\n", depth*2, indent.str, scope->next_sibling_scope_idx); - if(scope->inline_site_idx != 0) - { - dumpf("%.*s inline_site_idx =%u ('%S')\n", depth*2, indent.str, scope->inline_site_idx, inline_site_name); - } - dumpf("%.*s voff_ranges =%S\n", depth*2, indent.str, voff_range_list_string); - dumpf("%.*s locals=\n", depth*2, indent.str); - dumpf("%.*s {\n", depth*2, indent.str); - { - U32 local_lo = ClampTop(scope->local_first, locals_count); - U32 local_hi = ClampTop(local_lo + scope->local_count, locals_count); - if(local_lo < local_hi) - { - for(U32 local_idx = local_lo; local_idx < local_hi; local_idx += 1) - { - Temp scratch = scratch_begin(&arena, 1); - RDI_Local *local_ptr = &locals[local_idx]; - dumpf("%.*s local[%u]:\n", depth*2, indent.str, local_idx); - dumpf("%.*s kind =%S\n", depth*2, indent.str, rdi_string_from_local_kind(scratch.arena, local_ptr->kind)); - dumpf("%.*s name ='%S'\n", depth*2, indent.str, str8_from_rdi_string_idx(rdi, local_ptr->name_string_idx)); - dumpf("%.*s type_idx=%u\n", depth*2, indent.str, local_ptr->type_idx); - dumpf("%.*s locations=\n", depth*2, indent.str); - dumpf("%.*s {\n", depth*2, indent.str); - if(local_ptr->location_first < local_ptr->location_opl) - { - String8List locations_strings = rdi_strings_from_locations(arena, rdi, tli->arch, r1u64(local_ptr->location_first, local_ptr->location_opl)); - for(String8Node *n = locations_strings.first; n != 0; n = n->next) - { - dumpf("%.*s %S\n", depth*2, indent.str, n->string); - } - } - dumpf("%.*s }\n", depth*2, indent.str); - scratch_end(scratch); - } - } - } - dumpf("%.*s }\n", depth*2, indent.str); - - // rjf: get next recursion - rec_next = nil; - if(scope->first_child_scope_idx) - { - rec_next = rdi_element_from_name_idx(rdi, Scopes, scope->first_child_scope_idx); - depth += 1; - } - else for(RDI_Scope *p = scope; - p != nil; - p = rdi_element_from_name_idx(rdi, Scopes, p->parent_scope_idx), depth -= 1) - { - dumpf("%.*s} [/%I64u] \n", depth*2, indent.str, (U64)(p-v)); - if(p->next_sibling_scope_idx != 0) - { - rec_next = rdi_element_from_name_idx(rdi, Scopes, p->next_sibling_scope_idx); - break; - } - } - } - } - } - - ////////////////////////////// - //- rjf: dump scope vmap - // - DumpSubset(ScopeVMap) - { - U64 count = 0; - RDI_VMapEntry *v = rdi_table_from_name(rdi, ScopeVMap, &count); - for EachIndex(idx, count) - { - dumpf("%I64x -> #%I64u\n", v[idx].voff, v[idx].idx); - } - } - - ////////////////////////////// - //- rjf: dump inline sites - // - DumpSubset(InlineSites) - { - U64 count = 0; - RDI_InlineSite *v = rdi_table_from_name(rdi, InlineSites, &count); - for EachIndex(idx, count) - { - RDI_InlineSite *inline_site = &v[idx]; - Temp scratch = scratch_begin(&arena, 1); - String8 inline_site_idx = push_str8f(scratch.arena, "inline_site[%u]", idx); - String8 type_idx = push_str8f(scratch.arena, "type_idx = %u,", inline_site->type_idx); - String8 owner_type_idx = push_str8f(scratch.arena, "owner_type_idx = %u,", inline_site->owner_type_idx); - String8 line_table_idx = push_str8f(scratch.arena, "line_table_idx = %u,", inline_site->line_table_idx); - dumpf("%-20S = { %-25S %-25S %-25S name = '%-20S' }\n", - inline_site_idx, - type_idx, - owner_type_idx, - line_table_idx, - str8_from_rdi_string_idx(rdi, inline_site->name_string_idx)); - scratch_end(scratch); - } - } - - ////////////////////////////// - //- rjf: dump name maps - // - DumpSubset(NameMaps) - { - Temp scratch = scratch_begin(&arena, 1); - U64 count = 0; - RDI_NameMap *v = rdi_table_from_name(rdi, NameMaps, &count); - for EachIndex(idx, count) - { - if(idx > 0) { dumpf("\n"); } - RDI_ParsedNameMap name_map = {0}; - rdi_parsed_from_name_map(rdi, &v[idx], &name_map); - dumpf("name_map[%S]:\n", rdi_string_from_name_map_kind(idx)); - for EachIndex(bucket_idx, name_map.bucket_count) - { - if(name_map.buckets[bucket_idx].node_count == 0) { continue; } - dumpf(" bucket[%I64u]:\n", bucket_idx); - RDI_NameMapNode *node_ptr = name_map.nodes + name_map.buckets[bucket_idx].first_node; - RDI_NameMapNode *node_opl = node_ptr + name_map.buckets[bucket_idx].node_count; - for(;node_ptr < node_opl; node_ptr += 1) - { - Temp temp = temp_begin(scratch.arena); - String8 str = str8_from_rdi_string_idx(rdi, node_ptr->string_idx); - String8 indices = {0}; - if(node_ptr->match_count == 1) - { - indices = push_str8f(temp.arena, "%u", node_ptr->match_idx_or_idx_run_first); - } - else - { - U32 idx_count = 0; - U32 *idx_array = rdi_idx_run_from_first_count(rdi, node_ptr->match_idx_or_idx_run_first, node_ptr->match_count, &idx_count); - String8List idx_strings = {0}; - for(U32 idx_i = 0; idx_i < idx_count; idx_i += 1) - { - U32 idx = idx_array[idx_i]; - str8_list_pushf(temp.arena, &idx_strings, "%u"); - } - indices = str8_list_join(scratch.arena, &idx_strings, &(StringJoin){.sep = str8_lit(", ")}); - } - dumpf(" match \"%S\": %S\n", str, indices); - temp_end(temp); - } - } - } - scratch_end(scratch); - } - - ////////////////////////////// - //- rjf: dump strings - // - DumpSubset(Strings) - { - U64 count = 0; - U32 *v = rdi_table_from_name(rdi, StringTable, &count); - for EachIndex(idx, count) - { - dumpf("string[%I64u]: \"%S\"\n", idx, str8_from_rdi_string_idx(rdi, idx)); - } - } - -#undef DumpSubset -#undef dumpf -#undef dump - return strings; -} +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "lib_rdi/rdi.c" +#include "lib_rdi/rdi_parse.c" + +//////////////////////////////// +//~ rjf: RDI Decompression + +internal void +rdi_decompress_parsed(U8 *decompressed_data, U64 decompressed_size, RDI_Parsed *og_rdi) +{ + // rjf: copy header + RDI_Header *src_header = (RDI_Header *)og_rdi->raw_data; + RDI_Header *dst_header = (RDI_Header *)decompressed_data; + { + MemoryCopy(dst_header, src_header, sizeof(RDI_Header)); + } + + // rjf: copy & adjust sections for decompressed version + if(og_rdi->sections_count != 0) + { + RDI_Section *dsec_base = (RDI_Section *)(decompressed_data + dst_header->data_section_off); + MemoryCopy(dsec_base, (U8 *)og_rdi->raw_data + src_header->data_section_off, sizeof(RDI_Section) * og_rdi->sections_count); + U64 off = dst_header->data_section_off + sizeof(RDI_Section) * og_rdi->sections_count; + off += 7; + off -= off%8; + for(U64 idx = 0; idx < og_rdi->sections_count; idx += 1) + { + dsec_base[idx].encoding = RDI_SectionEncoding_Unpacked; + dsec_base[idx].off = off; + dsec_base[idx].encoded_size = dsec_base[idx].unpacked_size; + off += dsec_base[idx].unpacked_size; + off += 7; + off -= off%8; + } + } + + // rjf: decompress sections into new decompressed file buffer + if(og_rdi->sections_count != 0) + { + RDI_Section *src_first = og_rdi->sections; + RDI_Section *dst_first = (RDI_Section *)(decompressed_data + dst_header->data_section_off); + RDI_Section *src_opl = src_first + og_rdi->sections_count; + RDI_Section *dst_opl = dst_first + og_rdi->sections_count; + for(RDI_Section *src = src_first, *dst = dst_first; + src < src_opl && dst < dst_opl; + src += 1, dst += 1) + { + rr_lzb_simple_decode((U8*)og_rdi->raw_data + src->off, src->encoded_size, + decompressed_data + dst->off, dst->unpacked_size); + } + } +} + +//////////////////////////////// +//~ rjf: Lookup Helpers + +internal String8 +str8_from_rdi_string_idx(RDI_Parsed *rdi, U32 idx) +{ + String8 result = {0}; + result.str = rdi_string_from_idx(rdi, idx, &result.size); + return result; +} + +//////////////////////////////// +//~ rjf: String <=> Enum + +internal String8 +rdi_string_from_data_section_kind(Arena *arena, RDI_SectionKind v) +{ + String8 result = {0}; + switch(v) + { + default:{result = push_str8f(arena, "", v);}break; +#define X(name, lower, type) case RDI_SectionKind_##name:{result = str8_lit(#name);}break; + RDI_SectionKind_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_arch(Arena *arena, RDI_Arch v) +{ + String8 result = {0}; + switch(v) + { + default:{result = push_str8f(arena, "", v);} break; +#define X(name) case RDI_Arch_##name:{result = str8_lit(#name);} break; + RDI_Arch_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_language(Arena *arena, RDI_Language v) +{ + String8 result = {0}; + switch(v) + { + default:{result = push_str8f(arena, "", v);}break; +#define X(name) case RDI_Language_##name:{result = str8_lit(#name);}break; + RDI_Language_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_local_kind(Arena *arena, RDI_LocalKind v) +{ + String8 result = {0}; + switch(v) + { + default:{result = push_str8f(arena, "", v);}break; +#define X(name) case RDI_LocalKind_##name:{result = str8_lit(#name);}break; + RDI_LocalKind_XList +#undef X + } + return result; +} + +#if 0 +internal String8 +rdi_string_from_type_kind(Arena *arena, RDI_TypeKind v) +{ + String8 result = {0}; + switch(v) + { + default:{result = push_str8f(arena, "", v);}break; +#define X(name) case RDI_TypeKind_##name:{result = str8_lit(#name);}break; + RDI_TypeKind_XList +#undef X + } + return result; +} +#endif + +internal String8 +rdi_string_from_member_kind(Arena *arena, RDI_MemberKind v) +{ + String8 result = {0}; + switch(v) + { + default:{result = push_str8f(arena, "", v);}break; +#define X(name) case RDI_MemberKind_##name:{result = str8_lit(#name);}break; + RDI_MemberKind_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_name_map_kind(RDI_NameMapKind kind) +{ + String8 result = {0}; + switch(kind) + { + default:{}break; +#define X(name) case RDI_NameMapKind_##name:{result = str8_lit(#name);}break; + RDI_NameMapKind_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_reg_code_x86(U64 reg_code) +{ + String8 result = {0}; + switch(reg_code) + { + default:{}break; +#define X(name, value) case RDI_RegCodeX86_##name:{result = str8_lit(#name);}break; + RDI_RegCodeX86_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_reg_code_x64(U64 reg_code) +{ + String8 result = {0}; + switch(reg_code) + { + default:{}break; +#define X(name, value) case RDI_RegCodeX64_##name:{result = str8_lit(#name);}break; + RDI_RegCodeX64_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_reg_code(Arena *arena, RDI_Arch arch, U64 reg_code) +{ + String8 result = {0}; + switch(arch) + { + default: + case RDI_Arch_NULL: {result = push_str8f(arena, "??? (%llu)", reg_code);}break; + case RDI_Arch_X86: {result = rdi_string_from_reg_code_x86(reg_code);}break; + case RDI_Arch_X64: {result = rdi_string_from_reg_code_x64(reg_code);}break; + } + return result; +} + +internal String8 +rdi_string_from_eval_op(Arena *arena, RDI_EvalOp op) +{ + String8 result = {0}; + switch(op) + { + default:{result = push_str8f(arena, "%#x", op);}break; +#define X(name) case RDI_EvalOp_##name:{result = str8_lit("#name");}break; + RDI_EvalOp_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_eval_type_group(Arena *arena, RDI_EvalTypeGroup eval_type_group) +{ + String8 result = {0}; + switch(eval_type_group) + { + default:{result = push_str8f(arena, "%#x", eval_type_group);}break; +#define X(name) case RDI_EvalTypeGroup_##name:{result = str8_lit("#name");}break; + RDI_EvalTypeGroup_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_binary_section_flags(Arena *arena, RDI_BinarySectionFlags flags) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; +#define X(name) if (flags & RDI_BinarySectionFlag_##name) { flags &= ~RDI_BinarySectionFlag_##name; str8_list_push(scratch.arena, &list, str8_lit(#name)); } + RDI_BinarySectionFlags_XList; +#undef X + StringJoin join = {.sep = str8_lit("|")}; + String8 result = str8_list_join(arena, &list, &join); + if(result.size == 0) { result = str8_lit("None"); } + scratch_end(scratch); + return result; +} + +internal String8 +rdi_string_from_type_modifier_flags(Arena *arena, RDI_TypeModifierFlags flags) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; +#define X(name) if(flags & RDI_TypeModifierFlag_##name) { flags &= ~RDI_TypeModifierFlag_##name; str8_list_push(scratch.arena, &list, str8_lit(#name)); } + RDI_TypeModifierFlags_XList; +#undef X + StringJoin join = {.sep = str8_lit("|")}; + String8 result = str8_list_join(arena, &list, &join); + if(result.size == 0) { result = str8_lit("None"); } + scratch_end(scratch); + return result; +} + +internal String8 +rdi_string_from_udt_flags(Arena *arena, RDI_UDTFlags flags) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; +#define X(name) if (flags & RDI_UDTFlag_##name) { flags &= ~RDI_UDTFlag_##name; str8_list_push(scratch.arena, &list, str8_lit(#name)); } + RDI_UDTFlags_XList; +#undef X + StringJoin join = {.sep = str8_lit("|")}; + String8 result = str8_list_join(arena, &list, &join); + if(result.size == 0) { result = str8_lit("None"); } + scratch_end(scratch); + return result; +} + +internal String8 +rdi_string_from_link_flags(Arena *arena, RDI_LinkFlags flags) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; +#define X(name) if (flags & RDI_LinkFlag_##name) { flags &= ~RDI_LinkFlag_##name; str8_list_push(scratch.arena, &list, str8_lit(#name)); } + RDI_LinkFlags_XList; +#undef X + StringJoin join = {.sep = str8_lit("|")}; + String8 result = str8_list_join(arena, &list, &join); + if(result.size == 0) { result = str8_lit("None"); } + scratch_end(scratch); + return result; +} + +internal String8 +rdi_string_from_bytecode(Arena *arena, RDI_Arch arch, String8 bc) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List fmt = {0}; + for(U64 cursor = 0; cursor < bc.size; ) + { + RDI_EvalOp op = RDI_EvalOp_Stop; + cursor += str8_deserial_read_struct(bc, cursor, &op); + + U16 ctrlbits = rdi_eval_op_ctrlbits_table[op]; + U32 imm_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + + String8 imm = {0}; + cursor += str8_deserial_read_block(bc, cursor, imm_size, &imm); + if (imm.size != imm_size) { + str8_list_pushf(scratch.arena, &fmt, "(ERROR: not enough bytes to read immediate)"); + break; + } + + String8 imm_fmt = {0}; + switch (op) { + case RDI_EvalOp_Stop: goto exit; + case RDI_EvalOp_Noop: break; + case RDI_EvalOp_Cond: break; + case RDI_EvalOp_Skip: { + imm_fmt = push_str8f(scratch.arena, "%u", *(U16 *)imm.str); + } break; + case RDI_EvalOp_MemRead: { + imm_fmt = push_str8f(scratch.arena, "%u", *(U8 *)imm.str); + } break; + case RDI_EvalOp_RegRead: { + U32 regread = *(U32 *)imm.str; + RDI_RegCode reg_code = Extract8(regread, 0); + U8 byte_size = Extract8(regread, 1); + U8 byte_off = Extract8(regread, 2); + String8 reg_str = rdi_string_from_reg_code(scratch.arena, arch, reg_code); + imm_fmt = push_str8f(scratch.arena, "%S+%I64u, Size: %u", reg_str, byte_off, byte_size); + } break; + case RDI_EvalOp_RegReadDyn: break; + case RDI_EvalOp_FrameOff: { + imm_fmt = push_str8f(scratch.arena, "%+lld", *(S64 *)imm.str); + } break; + case RDI_EvalOp_ModuleOff: { + imm_fmt = push_str8f(scratch.arena, "%u", *(U32 *)imm.str); + } break; + case RDI_EvalOp_TLSOff: { + imm_fmt = push_str8f(scratch.arena, "%u", *(U32 *)imm.str); + } break; + case RDI_EvalOp_ConstU8: { + imm_fmt = push_str8f(scratch.arena, "%u", *(U8 *)imm.str); + } break; + case RDI_EvalOp_ConstU16: { + imm_fmt = push_str8f(scratch.arena, "%u", *(U16 *)imm.str); + } break; + case RDI_EvalOp_ConstU32: { + imm_fmt = push_str8f(scratch.arena, "%u", *(U32 *)imm.str); + } break; + case RDI_EvalOp_ConstU64: { + imm_fmt = push_str8f(scratch.arena, "%llu", *(U64 *)imm.str); + } break; + case RDI_EvalOp_ConstU128: { + imm_fmt = push_str8f(scratch.arena, "Lo: %llu, Hi: %llu", *(U64 *)imm.str, *((U64 *)imm.str + 1)); + } break; + case RDI_EvalOp_ConstString: { + U8 size = *(U8 *)imm.str; + String8 string = {0}; + cursor += str8_deserial_read_block(bc, cursor, size, &string); + + imm_fmt = push_str8f(scratch.arena, "(%u) \"%S\"", size, string); + } break; + case RDI_EvalOp_Abs: + case RDI_EvalOp_Neg: + case RDI_EvalOp_Add: + case RDI_EvalOp_Sub: + case RDI_EvalOp_Mul: + case RDI_EvalOp_Div: + case RDI_EvalOp_Mod: + case RDI_EvalOp_LShift: + case RDI_EvalOp_RShift: + case RDI_EvalOp_BitAnd: + case RDI_EvalOp_BitOr: + case RDI_EvalOp_BitXor: + case RDI_EvalOp_BitNot: + case RDI_EvalOp_LogAnd: + case RDI_EvalOp_LogOr: + case RDI_EvalOp_LogNot: + case RDI_EvalOp_EqEq: + case RDI_EvalOp_NtEq: + case RDI_EvalOp_LsEq: + case RDI_EvalOp_GrEq: + case RDI_EvalOp_Less: + case RDI_EvalOp_Grtr: { + U8 eval_type_group = *(U8 *)imm.str; + imm_fmt = rdi_string_from_eval_type_group(scratch.arena, eval_type_group); + } break; + case RDI_EvalOp_Trunc: + case RDI_EvalOp_TruncSigned: { + U8 trunc = *(U8 *)imm.str; + imm_fmt = push_str8f(scratch.arena, "%u", trunc); + } break; + case RDI_EvalOp_Convert: { + U16 convert = *(U16 *)imm.str; + U8 in = Extract8(convert, 0); + U8 out = Extract8(convert, 1); + String8 in_str = rdi_string_from_eval_type_group(scratch.arena, in); + String8 out_str = rdi_string_from_eval_type_group(scratch.arena, out); + imm_fmt = push_str8f(scratch.arena, "in: %S out: %S", in_str, out_str); + } break; + case RDI_EvalOp_Pick: { + U8 pick = *(U8 *)imm.str; + imm_fmt = push_str8f(scratch.arena, "%u", pick); + } break; + case RDI_EvalOp_Pop: break; + case RDI_EvalOp_Insert: { + U8 insert = *(U8 *)imm.str; + imm_fmt = push_str8f(scratch.arena, "%u", insert); + } break; + case RDI_EvalOp_ValueRead: { + U8 bytes_to_read = *(U8 *)imm.str; + imm_fmt = push_str8f(scratch.arena, "%u", bytes_to_read); + } break; + case RDI_EvalOp_ByteSwap: { + U8 byte_size = *(U8 *)imm.str; + imm_fmt = push_str8f(scratch.arena, "%u", byte_size); + } break; + case RDI_EvalOp_CallSiteValue: { + U32 call_site_bc_size = *(U32 *)imm.str; + String8 call_site_bc = {0}; + cursor += str8_deserial_read_block(bc, cursor, call_site_bc_size, &call_site_bc); + + String8 call_site_str = rdi_string_from_bytecode(scratch.arena, arch, call_site_bc); + imm_fmt = push_str8f(scratch.arena, "%S", call_site_str); + } break; + case RDI_EvalOp_PartialValue: { + U32 partial_value_size = *(U32 *)imm.str; + imm_fmt = push_str8f(scratch.arena, "%u", partial_value_size); + } break; + case RDI_EvalOp_PartialValueBit: { + U64 partial_value = *(U64 *)imm.str; + U32 bit_size = Extract32(partial_value, 0); + U32 bit_off = Extract32(partial_value, 1); + imm_fmt = push_str8f(scratch.arena, "Off: %u, Size: %u", bit_size, bit_off); + } break; + } + + String8 op_str = rdi_string_from_eval_op(scratch.arena, op); + if (imm_fmt.size) { + str8_list_pushf(scratch.arena, &fmt, "RDI_EvalOp_%S(%S)", op_str, imm_fmt); + } else { + str8_list_pushf(scratch.arena, &fmt, "RDI_EvalOp_%S", op_str); + } + } + exit:; + + String8 result = str8_list_join(arena, &fmt, &(StringJoin){.sep = str8_lit(", ")}); + + scratch_end(scratch); + return result; +} + +internal String8List +rdi_strings_from_locations(Arena *arena, RDI_Parsed *rdi, RDI_Arch arch, Rng1U64 location_block_range) +{ + String8List strings = {0}; + Temp scratch = scratch_begin(&arena, 1); + U64 location_block_count = 0; + U64 location_data_size = 0; + RDI_LocationBlock *location_block_array = rdi_table_from_name(rdi, LocationBlocks, &location_block_count); + RDI_U8 *location_data = rdi_table_from_name(rdi, LocationData, &location_data_size); + Rng1U64 location_block_range_clamped = r1u64(ClampTop(location_block_range.min, location_block_count), + ClampTop(location_block_range.max, location_block_count)); + for(U64 block_idx = location_block_range_clamped.min; + block_idx < location_block_range_clamped.max; + block_idx +=1) + { + String8 qualifier = {0}; + String8 location_info = {0}; + RDI_LocationBlock *block_ptr = &location_block_array[block_idx]; + if(block_ptr->scope_off_first == 0 && block_ptr->scope_off_opl == max_U32) + { + qualifier = str8_lit("*always*"); + } + else + { + qualifier = push_str8f(scratch.arena, "[%#08x, %#08x): ", block_ptr->scope_off_first, block_ptr->scope_off_opl); + } + if(block_ptr->location_data_off >= location_data_size) + { + location_info = push_str8f(scratch.arena, "", block_ptr->location_data_off); + } + else + { + U8 *loc_data_opl = location_data + location_data_size; + U8 *loc_base_ptr = location_data + block_ptr->location_data_off; + RDI_LocationKind kind = *(RDI_LocationKind *)loc_base_ptr; + switch(kind) + { + default: + { + location_info = push_str8f(scratch.arena, "\?\?\? (%u)", kind); + }break; + case RDI_LocationKind_AddrBytecodeStream: + { + String8 bc = str8_range(loc_base_ptr + 1, loc_data_opl); + String8 bc_str = rdi_string_from_bytecode(scratch.arena, arch, bc); + location_info = push_str8f(scratch.arena, "AddrBytecodeStream(%S)", bc_str); + }break; + case RDI_LocationKind_ValBytecodeStream: + { + String8 bc = str8_range(loc_base_ptr + 1, loc_data_opl); + String8 bc_str = rdi_string_from_bytecode(scratch.arena, arch, bc); + location_info = push_str8f(scratch.arena, "ValBytecodeStream(%S)", bc_str); + }break; + case RDI_LocationKind_AddrRegPlusU16: + { + if(loc_base_ptr + sizeof(RDI_LocationRegPlusU16) > loc_data_opl) + { + location_info = push_str8f(scratch.arena, "AddrRegPlusU16(\?\?\?)"); + } + else + { + RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16*)loc_base_ptr; + location_info = push_str8f(scratch.arena, "AddrRegPlusU16(reg: %S, off: %u)", rdi_string_from_reg_code(scratch.arena, arch, loc->reg_code), loc->offset); + } + }break; + case RDI_LocationKind_AddrAddrRegPlusU16: + { + if(loc_base_ptr + sizeof(RDI_LocationRegPlusU16) > loc_data_opl) + { + location_info = push_str8f(scratch.arena, "AddrAddrRegPlusU16(\?\?\?)"); + } + else + { + RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16 *)loc_base_ptr; + location_info = push_str8f(scratch.arena, "AddrAddrRegisterPlusU16(reg: %S, off: %u)", rdi_string_from_reg_code(scratch.arena, arch, loc->reg_code), loc->offset); + } + }break; + case RDI_LocationKind_ValReg: + { + if(loc_base_ptr + sizeof(RDI_LocationReg) > loc_data_opl) + { + location_info = push_str8f(scratch.arena, "ValReg(\?\?\?)"); + } + else + { + RDI_LocationReg *loc = (RDI_LocationReg*)loc_base_ptr; + location_info = push_str8f(scratch.arena, "ValReg(reg: %S)", rdi_string_from_reg_code(scratch.arena, arch, loc->reg_code)); + } + } break; + } + } + str8_list_pushf(arena, &strings, "%S: %S", qualifier, location_info); + } + scratch_end(scratch); + return strings; +} + +//////////////////////////////// +//~ rjf: RDI Dumping + +internal String8List +rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags flags) +{ + String8List strings = {0}; + String8 indent = str8_lit(" "); +#define dump(str) str8_list_push(arena, &strings, (str)) +#define dumpf(...) str8_list_pushf(arena, &strings, __VA_ARGS__) +#define DumpSubset(name) if(flags & RDI_DumpSubsetFlag_##name) DeferLoop(dumpf("# %S\n\n", rdi_name_title_from_dump_subset_table[RDI_DumpSubset_##name]), dump(str8_lit("\n"))) + + ////////////////////////////// + //- rjf: dump data sections + // + DumpSubset(DataSections) + { + for EachIndex(idx, rdi->sections_count) + { + Temp scratch = scratch_begin(&arena, 1); + RDI_SectionKind kind = (RDI_SectionKind)idx; + RDI_Section *section = &rdi->sections[idx]; + String8 kind_str = rdi_string_from_data_section_kind(scratch.arena, kind); + dumpf("data_section[%5llu] = {%#08llx, %7u, %7u}, %S\n", idx, section->off, section->encoded_size, section->unpacked_size, kind_str); + scratch_end(scratch); + } + } + + ////////////////////////////// + //- rjf: dump top-level-info + // + DumpSubset(TopLevelInfo) + { + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); + Temp scratch = scratch_begin(&arena, 1); + dumpf("arch =%S\n", rdi_string_from_arch(scratch.arena, tli->arch)); + dumpf("exe_name ='%S'\n", str8_from_rdi_string_idx(rdi, tli->exe_name_string_idx)); + dumpf("voff_max =%#08llx\n", tli->voff_max); + dumpf("producer_name='%S'\n", str8_from_rdi_string_idx(rdi, tli->producer_name_string_idx)); + scratch_end(scratch); + } + + ////////////////////////////// + //- rjf: dump binary sections + // + DumpSubset(BinarySections) + { + U64 count = 0; + RDI_BinarySection *v = rdi_table_from_name(rdi, BinarySections, &count); + for EachIndex(idx, count) + { + Temp scratch = scratch_begin(&arena, 1); + RDI_BinarySection *bin_section = &v[idx]; + dumpf("binary_section[%I64u]:\n", idx); + dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, bin_section->name_string_idx)); + dumpf(" flags =%S\n", rdi_string_from_binary_section_flags(scratch.arena, bin_section->flags)); + dumpf(" voff_first=%#08x\n", bin_section->voff_first); + dumpf(" voff_opl =%#08x\n", bin_section->voff_opl); + dumpf(" foff_first=%#08x\n", bin_section->foff_first); + dumpf(" foff_opl =%#08x\n", bin_section->foff_opl); + scratch_end(scratch); + } + } + + ////////////////////////////// + //- rjf: dump file paths + // + DumpSubset(FilePaths) + { + U64 count = 0; + RDI_FilePathNode *v = rdi_table_from_name(rdi, FilePathNodes, &count); + RDI_FilePathNode *nil = &v[0]; + for EachIndex(idx, count) + { + RDI_FilePathNode *root = &v[idx]; + if(root->parent_path_node != 0) { continue; } + S64 depth = 0; + for(RDI_FilePathNode *n = root, *rec_next = nil; n != nil; n = rec_next) + { + // rjf: dump + if(n->source_file_idx == 0) + { + dumpf("%.*s[%I64u] '%S'\n", depth*2, indent.str, (U64)(n - v), str8_from_rdi_string_idx(rdi, n->name_string_idx)); + } + else + { + dumpf("%.*s[%I64u] '%S': source_file=%u\n", depth*2, indent.str, (U64)(n - v), str8_from_rdi_string_idx(rdi, n->name_string_idx), n->source_file_idx); + } + + // rjf: find next node + rec_next = nil; + if(n->first_child) + { + rec_next = rdi_element_from_name_idx(rdi, FilePathNodes, n->first_child); + depth += 1; + } + else for(RDI_FilePathNode *p = n; + p != nil && p != root; + p = rdi_element_from_name_idx(rdi, FilePathNodes, p->parent_path_node), depth -= 1) + { + if(p->next_sibling) + { + rec_next = rdi_element_from_name_idx(rdi, FilePathNodes, p->next_sibling); + break; + } + } + } + } + } + + ////////////////////////////// + //- rjf: dump source files + // + DumpSubset(SourceFiles) + { + U64 source_file_count = 0; + RDI_SourceFile *source_file_array = rdi_table_from_name(rdi, SourceFiles, &source_file_count); + for(U64 i = 0; i < source_file_count; ++i) + { + RDI_SourceFile *source_file = &source_file_array[i]; + dumpf("source_file[%4llu] = { file_path_node_idx = %4u, source_line_map = %4u, path = '%S' }\n", + i, + source_file->file_path_node_idx, + source_file->source_line_map_idx, + str8_from_rdi_string_idx(rdi, source_file->normal_full_path_string_idx)); + } + } + + ////////////////////////////// + //- rjf: dump units + // + DumpSubset(Units) + { + U64 count = 0; + RDI_Unit *v = rdi_table_from_name(rdi, Units, &count); + for EachIndex(idx, count) + { + RDI_Unit *unit = &v[idx]; + Temp scratch = scratch_begin(&arena, 1); + dumpf("unit[%I64u]:\n", idx); + dumpf(" unit_name ='%S'\n", str8_from_rdi_string_idx(rdi, unit->unit_name_string_idx)); + dumpf(" compiler_name ='%S'\n", str8_from_rdi_string_idx(rdi, unit->compiler_name_string_idx)); + dumpf(" source_file_path =%u\n", unit->source_file_path_node); + dumpf(" object_file_path =%u\n", unit->object_file_path_node); + dumpf(" archive_file_path=%u\n", unit->archive_file_path_node); + dumpf(" build_path =%u\n", unit->build_path_node); + dumpf(" language =%S\n", rdi_string_from_language(scratch.arena, unit->language)); + dumpf(" line_table_idx =%u\n", unit->line_table_idx); + scratch_end(scratch); + } + } + + ////////////////////////////// + //- rjf: dump unit vmap + // + DumpSubset(UnitVMap) + { + U64 count = 0; + RDI_VMapEntry *v = rdi_table_from_name(rdi, UnitVMap, &count); + for EachIndex(idx, count) + { + dumpf("%I64x -> #%I64u\n", v[idx].voff, v[idx].idx); + } + } + + ////////////////////////////// + //- rjf: dump line tables + // + DumpSubset(LineTables) + { + U64 count = 0; + RDI_LineTable *v = rdi_table_from_name(rdi, LineTables, &count); + for EachIndex(idx, count) + { + RDI_LineTable *line_table = &v[idx]; + RDI_ParsedLineTable parsed_line_table = {0}; + rdi_parsed_from_line_table(rdi, line_table, &parsed_line_table); + dumpf("line_table[%I64u]:\n", idx); + for EachIndex(line_idx, parsed_line_table.count) + { + U64 first = parsed_line_table.voffs[line_idx]; + U64 opl = parsed_line_table.voffs[line_idx + 1]; + RDI_Line *line = parsed_line_table.lines + line_idx; + RDI_Column *col = 0; + if(line_idx < parsed_line_table.col_count) + { + col = parsed_line_table.cols + line_idx; + } + if(col == 0) + { + dumpf(" [0x%08I64x,0x%08I64x) file=%u; line=%u\n", first, opl, line->file_idx, line->line_num); + } + else + { + dumpf(" [0x%08I64x,0x%08I64x) file=%u; line=%u; columns=[%u,%u)\n", first, opl, line->file_idx, line->line_num, col->col_first, col->col_opl); + } + } + } + } + + ////////////////////////////// + //- rjf: dump source line maps + // + DumpSubset(SourceLineMaps) + { + U64 count = 0; + RDI_SourceLineMap *v = rdi_table_from_name(rdi, SourceLineMaps, &count); + for EachIndex(idx, count) + { + Temp scratch = scratch_begin(&arena, 1); + RDI_ParsedSourceLineMap line_map = {0}; + rdi_parsed_from_source_line_map(rdi, &v[idx], &line_map); + dumpf("source_line_map[%I64u]:\n", idx); + for EachIndex(line_num_idx, line_map.count) + { + Temp temp = temp_begin(scratch.arena); + String8List list = {0}; + U32 voff_lo = line_map.ranges[line_num_idx]; + U32 voff_hi = ClampTop(line_map.ranges[line_num_idx + 1], line_map.voff_count); + for(U64 voff_idx = voff_lo; voff_idx < voff_hi; voff_idx += 1) + { + str8_list_pushf(temp.arena, &list, "%#llx", line_map.voffs[voff_idx]); + } + String8 voffs_string = str8_list_join(temp.arena, &list, &(StringJoin){.sep = str8_lit(", ")}); + dumpf(" %u: %S\n", line_map.nums[line_num_idx], voffs_string); + temp_end(temp); + } + scratch_end(scratch); + } + } + + ////////////////////////////// + //- rjf: dump type nodes + // + DumpSubset(TypeNodes) + { + U64 count = 0; + RDI_TypeNode *v = rdi_table_from_name(rdi, TypeNodes, &count); + for EachIndex(idx, count) + { + Temp scratch = scratch_begin(&arena, 1); + RDI_TypeNode *type = &v[idx]; + String8 type_kind_str = {0}; + type_kind_str.str = rdi_string_from_type_kind(type->kind, &type_kind_str.size); + dumpf("type[%I64u]:\n", idx); + dumpf(" kind =%S\n", type_kind_str); + if(type->kind == RDI_TypeKind_Modifier) + { + dumpf(" flags =%S\n", rdi_string_from_type_modifier_flags(scratch.arena, type->flags)); + } + else if(type->flags != 0) + { + dumpf(" flags=%#x (missing stringizer path)\n", type->flags); + } + dumpf(" byte_size =%u\n", type->byte_size); + if(RDI_TypeKind_FirstBuiltIn <= type->kind && type->kind <= RDI_TypeKind_LastBuiltIn) + { + dumpf(" built_in.name ='%S'\n", str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx)); + } + else if(type->kind == RDI_TypeKind_Array) + { + dumpf(" constructed.direct_type =%u\n", type->constructed.direct_type_idx); + dumpf(" constructed.array_count =%u\n", type->constructed.count); + } + else if(type->kind == RDI_TypeKind_Function) + { + U32 param_idx_count = 0; + U32 *param_idx_array = rdi_idx_run_from_first_count(rdi, type->constructed.param_idx_run_first, type->constructed.count, ¶m_idx_count); + String8List param_idx_strings = {0}; + for(U32 param_idx = 0; param_idx < param_idx_count; param_idx += 1) + { + str8_list_pushf(scratch.arena, ¶m_idx_strings, "%u", param_idx_array[param_idx]); + } + String8 param_idx_str = str8_list_join(scratch.arena, ¶m_idx_strings, &(StringJoin){.pre = str8_lit("["), .sep = str8_lit(", "), .post = str8_lit("]")}); + dumpf(" constructed.params =%S\n", param_idx_str); + dumpf(" return_type =%u\n", type->constructed.direct_type_idx); + } + else if(type->kind == RDI_TypeKind_Method) + { + U32 param_idx_count = 0; + U32 *param_idx_array = rdi_idx_run_from_first_count(rdi, type->constructed.param_idx_run_first, type->constructed.count, ¶m_idx_count); + String8 this_type_str = str8_lit("\?\?\?"); + if(param_idx_count > 0) + { + this_type_str = push_str8f(scratch.arena, "%u", param_idx_array[0]); + param_idx_count -= 1; + param_idx_array += 1; + } + String8List param_idx_strings = {0}; + for(U32 param_idx = 0; param_idx < param_idx_count; param_idx += 1) + { + str8_list_pushf(scratch.arena, ¶m_idx_strings, "%u", param_idx_array[param_idx]); + } + String8 param_idx_str = str8_list_join(scratch.arena, ¶m_idx_strings, &(StringJoin){.pre = str8_lit("["), .sep = str8_lit(", "), .post = str8_lit("]")}); + dumpf(" constructed.this_type =%S\n", this_type_str); + dumpf(" constructed.params =%S\n", param_idx_str); + dumpf(" return_type =%u\n", type->constructed.direct_type_idx); + } + else if(RDI_TypeKind_FirstConstructed <= type->kind && type->kind <= RDI_TypeKind_LastConstructed) + { + dumpf(" constructed.direct_type =%u\n", type->constructed.direct_type_idx); + } + else if(RDI_TypeKind_FirstUserDefined <= type->kind && type->kind <= RDI_TypeKind_LastUserDefined) + { + dumpf(" user_defined.name ='%S'\n", str8_from_rdi_string_idx(rdi, type->user_defined.name_string_idx)); + dumpf(" user_defined.direct_type=%u\n", type->user_defined.direct_type_idx); + dumpf(" user_defined.udt =%u\n", type->user_defined.udt_idx); + } + else if(type->kind == RDI_TypeKind_Bitfield) + { + dumpf(" bitfield.off =%u\n", type->bitfield.off); + dumpf(" bitfield.size =%u\n", type->bitfield.size); + } + scratch_end(scratch); + } + } + + ////////////////////////////// + //- rjf: dump user defined types + // + DumpSubset(UserDefinedTypes) + { + U64 count = 0; + RDI_UDT *v = rdi_table_from_name(rdi, UDTs, &count); + U64 all_members_count = 0; + RDI_Member *all_members = rdi_table_from_name(rdi, Members, &all_members_count); + U64 all_enum_members_count = 0; + RDI_EnumMember *all_enum_members = rdi_table_from_name(rdi, EnumMembers, &all_enum_members_count); + for EachIndex(idx, count) + { + RDI_UDT *udt = &v[idx]; + Temp scratch = scratch_begin(&arena, 1); + dumpf("udt[%I64u]:\n", idx); + dumpf(" self_type=%u\n", udt->self_type_idx); + dumpf(" flags =%S\n", rdi_string_from_udt_flags(scratch.arena, udt->flags)); + if(udt->file_idx != 0) + { + dumpf(" loc ={file=%u; line=%u; col=%u}\n", udt->file_idx, udt->line, udt->col); + } + if(udt->flags & RDI_UDTFlag_EnumMembers) + { + U32 member_hi = ClampTop(udt->member_first + udt->member_count, all_enum_members_count); + U32 member_lo = ClampTop(udt->member_first, member_hi); + if(member_lo < member_hi) + { + dumpf(" enum_members=\n"); + dumpf(" {\n"); + for(U32 enum_member_idx = member_lo; enum_member_idx < member_hi; enum_member_idx += 1) + { + RDI_EnumMember *enum_member = &all_enum_members[enum_member_idx]; + dumpf(" { %llu, '%S' }\n", enum_member->val, str8_from_rdi_string_idx(rdi, enum_member->name_string_idx)); + } + dumpf(" }\n"); + } + } + else + { + U32 member_hi = ClampTop(udt->member_first + udt->member_count, all_members_count); + U32 member_lo = ClampTop(udt->member_first, member_hi); + if(member_lo < member_hi) + { + dumpf(" members=\n"); + dumpf(" {\n"); + for(U32 member_idx = member_lo; member_idx < member_hi; member_idx += 1) + { + RDI_Member *member = &all_members[member_idx]; + String8 kind_str = rdi_string_from_member_kind(scratch.arena, member->kind); + String8 name_str = str8_from_rdi_string_idx(rdi, member->name_string_idx); + dumpf(" { kind=%S, type=%u, off=%u, name='%S' }\n", kind_str, member->type_idx, member->off, name_str); + } + dumpf(" }\n"); + } + } + scratch_end(scratch); + } + } + + ////////////////////////////// + //- rjf: dump global variables + // + DumpSubset(GlobalVariables) + { + U64 count = 0; + RDI_GlobalVariable *v = rdi_table_from_name(rdi, GlobalVariables, &count); + for EachIndex(idx, count) + { + RDI_GlobalVariable *gvar = &v[idx]; + Temp scratch = scratch_begin(&arena, 1); + dumpf("global_variable[%I64u]:\n", idx); + dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, gvar->name_string_idx)); + dumpf(" link_flags =%S\n", rdi_string_from_link_flags(scratch.arena, gvar->link_flags)); + dumpf(" voff =%#08x\n", gvar->voff); + dumpf(" type_idx =%u\n", gvar->type_idx); + dumpf(" container_idx=%u\n", gvar->container_idx); + scratch_end(scratch); + } + } + + ////////////////////////////// + //- rjf: dump global variables vmap + // + DumpSubset(GlobalVariablesVMap) + { + U64 count = 0; + RDI_VMapEntry *v = rdi_table_from_name(rdi, GlobalVMap, &count); + for EachIndex(idx, count) + { + dumpf("%I64x -> #%I64u\n", v[idx].voff, v[idx].idx); + } + } + + ////////////////////////////// + //- rjf: dump thread variables + // + DumpSubset(ThreadVariables) + { + U64 count = 0; + RDI_ThreadVariable *v = rdi_table_from_name(rdi, ThreadVariables, &count); + for EachIndex(idx, count) + { + RDI_ThreadVariable *tvar = &v[idx]; + Temp scratch = scratch_begin(&arena, 1); + dumpf("thread_variable[%I64u]:\n", idx); + dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, tvar->name_string_idx)); + dumpf(" link_flags =%S\n", rdi_string_from_link_flags(scratch.arena, tvar->link_flags)); + dumpf(" tls_off =%#08x\n", tvar->tls_off); + dumpf(" type_idx =%u\n", tvar->type_idx); + dumpf(" container_idx=%u\n", tvar->container_idx); + scratch_end(scratch); + } + } + + ////////////////////////////// + //- rjf: dump constants + // + DumpSubset(Constants) + { + U64 count = 0; + RDI_Constant *v = rdi_table_from_name(rdi, Constants, &count); + for EachIndex(idx, count) + { + RDI_Constant *cnst = &v[idx]; + dumpf("constant[%I64u]:\n", idx); + dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, cnst->name_string_idx)); + dumpf(" type_idx ='%u'\n", cnst->type_idx); + } + } + + ////////////////////////////// + //- rjf: dump procedures + // + DumpSubset(Procedures) + { + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); + U64 count = 0; + RDI_Procedure *v = rdi_table_from_name(rdi, Procedures, &count); + for EachIndex(idx, count) + { + RDI_Procedure *proc = &v[idx]; + Temp scratch = scratch_begin(&arena, 1); + String8List frame_base_location_strings = rdi_strings_from_locations(scratch.arena, rdi, tli->arch, r1u64(proc->frame_base_location_first, proc->frame_base_location_opl)); + dumpf("procedure[%I64u]:\n", idx); + dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, proc->name_string_idx)); + dumpf(" link_name ='%S'\n", str8_from_rdi_string_idx(rdi, proc->link_name_string_idx)); + dumpf(" link_flags =%S\n", rdi_string_from_link_flags(scratch.arena, proc->link_flags)); + dumpf(" type_idx =%u\n", proc->type_idx); + dumpf(" root_scope_idx =%u\n", proc->root_scope_idx); + dumpf(" container_idx =%u\n", proc->container_idx); + dumpf(" frame_base (first=%u, opl=%u)=\n", proc->frame_base_location_first, proc->frame_base_location_opl); + dumpf(" {\n"); + for(String8Node *n = frame_base_location_strings.first; n != 0; n = n->next) + { + dumpf(" %S\n", n->string); + } + dumpf(" }\n"); + scratch_end(scratch); + } + } + + ////////////////////////////// + //- rjf: dump scopes + // + DumpSubset(Scopes) + { + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); + U64 scope_voffs_count = 0; + U64 *scope_voffs = rdi_table_from_name(rdi, ScopeVOffData, &scope_voffs_count); + U64 locals_count = 0; + RDI_Local *locals = rdi_table_from_name(rdi, Locals, &locals_count); + U64 count = 0; + RDI_Scope *v = rdi_table_from_name(rdi, Scopes, &count); + RDI_Scope *nil = &v[0]; + for EachIndex(idx, count) + { + if(v[idx].parent_scope_idx != 0) { continue; } + RDI_Scope *root = &v[idx]; + S64 depth = 0; + for(RDI_Scope *scope = root, *rec_next = nil; scope != nil; scope = rec_next) + { + // rjf: scope list(voff_range) => string + String8 voff_range_list_string = {0}; + { + U32 voff_range_lo = ClampTop(scope->voff_range_first, scope_voffs_count); + U32 voff_range_hi = ClampTop(scope->voff_range_opl, scope_voffs_count); + U32 voff_range_count = (voff_range_hi - voff_range_lo); + U64 *voff_ptr = scope_voffs + voff_range_lo; + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + for(U64 i = 0; i+2 <= voff_range_count; i += 2) + { + str8_list_pushf(scratch.arena, &list, "[%#llx, %#llx)", voff_ptr[i+0], voff_ptr[i+1]); + } + voff_range_list_string = str8_list_join(arena, &list, &(StringJoin){.sep = str8_lit(", ")}); + scratch_end(scratch); + } + + // rjf: scope procedure -> name + String8 procedure_name = str8_from_rdi_string_idx(rdi, rdi_element_from_name_idx(rdi, Procedures, scope->proc_idx)->name_string_idx); + if(procedure_name.size == 0) + { + procedure_name = str8_lit("???"); + } + + // rjf: scope inline site -> name + String8 inline_site_name = str8_from_rdi_string_idx(rdi, rdi_element_from_name_idx(rdi, InlineSites, scope->inline_site_idx)->name_string_idx); + if(inline_site_name.size == 0) + { + inline_site_name = str8_lit("???"); + } + + // rjf: dump + dumpf("%.*sscope[%I64u]:\n", depth*2, indent.str, (U64)(scope - v)); + dumpf("%.*s{\n", depth*2, indent.str); + dumpf("%.*s proc_idx =%u ('%S')\n", depth*2, indent.str, scope->proc_idx, procedure_name); + dumpf("%.*s first_child_scope_idx =%u\n", depth*2, indent.str, scope->first_child_scope_idx); + dumpf("%.*s next_sibling_scope_idx=%u\n", depth*2, indent.str, scope->next_sibling_scope_idx); + if(scope->inline_site_idx != 0) + { + dumpf("%.*s inline_site_idx =%u ('%S')\n", depth*2, indent.str, scope->inline_site_idx, inline_site_name); + } + dumpf("%.*s voff_ranges =%S\n", depth*2, indent.str, voff_range_list_string); + dumpf("%.*s locals=\n", depth*2, indent.str); + dumpf("%.*s {\n", depth*2, indent.str); + { + U32 local_lo = ClampTop(scope->local_first, locals_count); + U32 local_hi = ClampTop(local_lo + scope->local_count, locals_count); + if(local_lo < local_hi) + { + for(U32 local_idx = local_lo; local_idx < local_hi; local_idx += 1) + { + Temp scratch = scratch_begin(&arena, 1); + RDI_Local *local_ptr = &locals[local_idx]; + dumpf("%.*s local[%u]:\n", depth*2, indent.str, local_idx); + dumpf("%.*s kind =%S\n", depth*2, indent.str, rdi_string_from_local_kind(scratch.arena, local_ptr->kind)); + dumpf("%.*s name ='%S'\n", depth*2, indent.str, str8_from_rdi_string_idx(rdi, local_ptr->name_string_idx)); + dumpf("%.*s type_idx=%u\n", depth*2, indent.str, local_ptr->type_idx); + dumpf("%.*s locations=\n", depth*2, indent.str); + dumpf("%.*s {\n", depth*2, indent.str); + if(local_ptr->location_first < local_ptr->location_opl) + { + String8List locations_strings = rdi_strings_from_locations(arena, rdi, tli->arch, r1u64(local_ptr->location_first, local_ptr->location_opl)); + for(String8Node *n = locations_strings.first; n != 0; n = n->next) + { + dumpf("%.*s %S\n", depth*2, indent.str, n->string); + } + } + dumpf("%.*s }\n", depth*2, indent.str); + scratch_end(scratch); + } + } + } + dumpf("%.*s }\n", depth*2, indent.str); + + // rjf: get next recursion + rec_next = nil; + if(scope->first_child_scope_idx) + { + rec_next = rdi_element_from_name_idx(rdi, Scopes, scope->first_child_scope_idx); + depth += 1; + } + else for(RDI_Scope *p = scope; + p != nil; + p = rdi_element_from_name_idx(rdi, Scopes, p->parent_scope_idx), depth -= 1) + { + dumpf("%.*s} [/%I64u] \n", depth*2, indent.str, (U64)(p-v)); + if(p->next_sibling_scope_idx != 0) + { + rec_next = rdi_element_from_name_idx(rdi, Scopes, p->next_sibling_scope_idx); + break; + } + } + } + } + } + + ////////////////////////////// + //- rjf: dump scope vmap + // + DumpSubset(ScopeVMap) + { + U64 count = 0; + RDI_VMapEntry *v = rdi_table_from_name(rdi, ScopeVMap, &count); + for EachIndex(idx, count) + { + dumpf("%I64x -> #%I64u\n", v[idx].voff, v[idx].idx); + } + } + + ////////////////////////////// + //- rjf: dump inline sites + // + DumpSubset(InlineSites) + { + U64 count = 0; + RDI_InlineSite *v = rdi_table_from_name(rdi, InlineSites, &count); + for EachIndex(idx, count) + { + RDI_InlineSite *inline_site = &v[idx]; + Temp scratch = scratch_begin(&arena, 1); + String8 inline_site_idx = push_str8f(scratch.arena, "inline_site[%u]", idx); + String8 type_idx = push_str8f(scratch.arena, "type_idx = %u,", inline_site->type_idx); + String8 owner_type_idx = push_str8f(scratch.arena, "owner_type_idx = %u,", inline_site->owner_type_idx); + String8 line_table_idx = push_str8f(scratch.arena, "line_table_idx = %u,", inline_site->line_table_idx); + dumpf("%-20S = { %-25S %-25S %-25S name = '%-20S' }\n", + inline_site_idx, + type_idx, + owner_type_idx, + line_table_idx, + str8_from_rdi_string_idx(rdi, inline_site->name_string_idx)); + scratch_end(scratch); + } + } + + ////////////////////////////// + //- rjf: dump name maps + // + DumpSubset(NameMaps) + { + Temp scratch = scratch_begin(&arena, 1); + U64 count = 0; + RDI_NameMap *v = rdi_table_from_name(rdi, NameMaps, &count); + for EachIndex(idx, count) + { + if(idx > 0) { dumpf("\n"); } + RDI_ParsedNameMap name_map = {0}; + rdi_parsed_from_name_map(rdi, &v[idx], &name_map); + dumpf("name_map[%S]:\n", rdi_string_from_name_map_kind(idx)); + for EachIndex(bucket_idx, name_map.bucket_count) + { + if(name_map.buckets[bucket_idx].node_count == 0) { continue; } + dumpf(" bucket[%I64u]:\n", bucket_idx); + RDI_NameMapNode *node_ptr = name_map.nodes + name_map.buckets[bucket_idx].first_node; + RDI_NameMapNode *node_opl = node_ptr + name_map.buckets[bucket_idx].node_count; + for(;node_ptr < node_opl; node_ptr += 1) + { + Temp temp = temp_begin(scratch.arena); + String8 str = str8_from_rdi_string_idx(rdi, node_ptr->string_idx); + String8 indices = {0}; + if(node_ptr->match_count == 1) + { + indices = push_str8f(temp.arena, "%u", node_ptr->match_idx_or_idx_run_first); + } + else + { + U32 idx_count = 0; + U32 *idx_array = rdi_idx_run_from_first_count(rdi, node_ptr->match_idx_or_idx_run_first, node_ptr->match_count, &idx_count); + String8List idx_strings = {0}; + for(U32 idx_i = 0; idx_i < idx_count; idx_i += 1) + { + U32 idx = idx_array[idx_i]; + str8_list_pushf(temp.arena, &idx_strings, "%u"); + } + indices = str8_list_join(scratch.arena, &idx_strings, &(StringJoin){.sep = str8_lit(", ")}); + } + dumpf(" match \"%S\": %S\n", str, indices); + temp_end(temp); + } + } + } + scratch_end(scratch); + } + + ////////////////////////////// + //- rjf: dump strings + // + DumpSubset(Strings) + { + U64 count = 0; + U32 *v = rdi_table_from_name(rdi, StringTable, &count); + for EachIndex(idx, count) + { + dumpf("string[%I64u]: \"%S\"\n", idx, str8_from_rdi_string_idx(rdi, idx)); + } + } + +#undef DumpSubset +#undef dumpf +#undef dump + return strings; +} diff --git a/src/rdi_format/rdi_format_local.h b/src/rdi/rdi_local.h similarity index 95% rename from src/rdi_format/rdi_format_local.h rename to src/rdi/rdi_local.h index 0dea0f1c..53b8f2b8 100644 --- a/src/rdi_format/rdi_format_local.h +++ b/src/rdi/rdi_local.h @@ -1,102 +1,102 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RDI_FORMAT_LOCAL_H -#define RDI_FORMAT_LOCAL_H - -#include "lib_rdi_format/rdi_format.h" -#include "lib_rdi_format/rdi_format_parse.h" - -//////////////////////////////// -//~ rjf: RDI Dumping Flags - -#define RDI_DumpSubset_XList \ -X(DataSections, data_sections, "DATA SECTIONS")\ -X(TopLevelInfo, top_level_info, "TOP LEVEL INFO")\ -X(BinarySections, binary_sections, "BINARY SECTIONS")\ -X(FilePaths, file_paths, "FILE PATHS")\ -X(SourceFiles, source_files, "SOURCE FILES")\ -X(LineTables, line_tables, "LINE TABLES")\ -X(SourceLineMaps, source_line_maps, "SOURCE LINE MAPS")\ -X(Units, units, "UNITS")\ -X(UnitVMap, unit_vmap, "UNIT VMAP")\ -X(TypeNodes, type_nodes, "TYPE NODES")\ -X(UserDefinedTypes, user_defined_types, "USER DEFINED TYPES")\ -X(GlobalVariables, global_variables, "GLOBAL VARIABLES")\ -X(GlobalVariablesVMap, global_variables_vmap, "GLOBAL VARIABLE VMAP")\ -X(ThreadVariables, thread_variables, "THREAD VARIABLES")\ -X(Constants, constants, "CONSTANTS")\ -X(Procedures, procedures, "PROCEDURES")\ -X(Scopes, scopes, "SCOPES")\ -X(ScopeVMap, scope_vmap, "SCOPE VMAP")\ -X(InlineSites, inline_sites, "INLINE SITES")\ -X(NameMaps, name_maps, "NAME MAPS")\ -X(Strings, strings, "STRINGS")\ - -typedef enum RDI_DumpSubset -{ -#define X(name, name_lower, title) RDI_DumpSubset_##name, - RDI_DumpSubset_XList -#undef X -} -RDI_DumpSubset; - -typedef U32 RDI_DumpSubsetFlags; -enum -{ -#define X(name, name_lower, title) RDI_DumpSubsetFlag_##name = (1< Enum - -internal String8 rdi_string_from_data_section_kind(Arena *arena, RDI_SectionKind v); -internal String8 rdi_string_from_arch (Arena *arena, RDI_Arch v); -internal String8 rdi_string_from_language (Arena *arena, RDI_Language v); -internal String8 rdi_string_from_local_kind (Arena *arena, RDI_LocalKind v); -#if 0 // TODO(rjf): conflicts with RDI... -internal String8 rdi_string_from_type_kind (Arena *arena, RDI_TypeKind v); -#endif -internal String8 rdi_string_from_member_kind (Arena *arena, RDI_MemberKind v); -internal String8 rdi_string_from_name_map_kind(RDI_NameMapKind kind); - -internal String8 rdi_string_from_binary_section_flags(Arena *arena, RDI_BinarySectionFlags flags); -internal String8 rdi_string_from_type_modifier (Arena *arena, RDI_TypeModifierFlags flags); -internal String8 rdi_string_from_udt_flags (Arena *arena, RDI_UDTFlags flags); -internal String8 rdi_string_from_link_flags (Arena *arena, RDI_LinkFlags flags); -internal String8 rdi_string_from_bytecode(Arena *arena, RDI_Arch arch, String8 bc); -internal String8List rdi_strings_from_locations(Arena *arena, RDI_Parsed *rdi, RDI_Arch arch, Rng1U64 location_block_range); - -//////////////////////////////// -//~ rjf: RDI Dumping - -internal String8List rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags flags); - -#endif // RDI_FORMAT_LOCAL_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RDI_FORMAT_LOCAL_H +#define RDI_FORMAT_LOCAL_H + +#include "lib_rdi/rdi.h" +#include "lib_rdi/rdi_parse.h" + +//////////////////////////////// +//~ rjf: RDI Dumping Flags + +#define RDI_DumpSubset_XList \ +X(DataSections, data_sections, "DATA SECTIONS")\ +X(TopLevelInfo, top_level_info, "TOP LEVEL INFO")\ +X(BinarySections, binary_sections, "BINARY SECTIONS")\ +X(FilePaths, file_paths, "FILE PATHS")\ +X(SourceFiles, source_files, "SOURCE FILES")\ +X(LineTables, line_tables, "LINE TABLES")\ +X(SourceLineMaps, source_line_maps, "SOURCE LINE MAPS")\ +X(Units, units, "UNITS")\ +X(UnitVMap, unit_vmap, "UNIT VMAP")\ +X(TypeNodes, type_nodes, "TYPE NODES")\ +X(UserDefinedTypes, user_defined_types, "USER DEFINED TYPES")\ +X(GlobalVariables, global_variables, "GLOBAL VARIABLES")\ +X(GlobalVariablesVMap, global_variables_vmap, "GLOBAL VARIABLE VMAP")\ +X(ThreadVariables, thread_variables, "THREAD VARIABLES")\ +X(Constants, constants, "CONSTANTS")\ +X(Procedures, procedures, "PROCEDURES")\ +X(Scopes, scopes, "SCOPES")\ +X(ScopeVMap, scope_vmap, "SCOPE VMAP")\ +X(InlineSites, inline_sites, "INLINE SITES")\ +X(NameMaps, name_maps, "NAME MAPS")\ +X(Strings, strings, "STRINGS")\ + +typedef enum RDI_DumpSubset +{ +#define X(name, name_lower, title) RDI_DumpSubset_##name, + RDI_DumpSubset_XList +#undef X +} +RDI_DumpSubset; + +typedef U32 RDI_DumpSubsetFlags; +enum +{ +#define X(name, name_lower, title) RDI_DumpSubsetFlag_##name = (1< Enum + +internal String8 rdi_string_from_data_section_kind(Arena *arena, RDI_SectionKind v); +internal String8 rdi_string_from_arch (Arena *arena, RDI_Arch v); +internal String8 rdi_string_from_language (Arena *arena, RDI_Language v); +internal String8 rdi_string_from_local_kind (Arena *arena, RDI_LocalKind v); +#if 0 // TODO(rjf): conflicts with RDI... +internal String8 rdi_string_from_type_kind (Arena *arena, RDI_TypeKind v); +#endif +internal String8 rdi_string_from_member_kind (Arena *arena, RDI_MemberKind v); +internal String8 rdi_string_from_name_map_kind(RDI_NameMapKind kind); + +internal String8 rdi_string_from_binary_section_flags(Arena *arena, RDI_BinarySectionFlags flags); +internal String8 rdi_string_from_type_modifier (Arena *arena, RDI_TypeModifierFlags flags); +internal String8 rdi_string_from_udt_flags (Arena *arena, RDI_UDTFlags flags); +internal String8 rdi_string_from_link_flags (Arena *arena, RDI_LinkFlags flags); +internal String8 rdi_string_from_bytecode(Arena *arena, RDI_Arch arch, String8 bc); +internal String8List rdi_strings_from_locations(Arena *arena, RDI_Parsed *rdi, RDI_Arch arch, Rng1U64 location_block_range); + +//////////////////////////////// +//~ rjf: RDI Dumping + +internal String8List rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags flags); + +#endif // RDI_FORMAT_LOCAL_H