From 82c1badcdc26b12b27be6dd67e8bdfc3ebaa8028 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 1 Jun 2024 12:05:51 -0700 Subject: [PATCH] reorganize generated & handwritten library (relocatable) rad debug info format files; separate from codebase-local tools for managing or internally including the libraries --- src/lib_rdi_format/rdi_format.c | 211 +- src/lib_rdi_format/rdi_format.h | 1724 +++++++++-------- src/metagen/metagen_main.c | 11 +- src/rdi_format/lib/rdi_format.c | 196 -- src/rdi_format/lib/rdi_format.h | 1009 ---------- src/rdi_format/rdi_format.mdesk | 2 +- .../rdi_format_local.c | 0 .../rdi_format_local.h | 0 8 files changed, 1067 insertions(+), 2086 deletions(-) delete mode 100644 src/rdi_format/lib/rdi_format.c delete mode 100644 src/rdi_format/lib/rdi_format.h rename src/{rdi_format_local => rdi_format}/rdi_format_local.c (100%) rename src/{rdi_format_local => rdi_format}/rdi_format_local.h (100%) diff --git a/src/lib_rdi_format/rdi_format.c b/src/lib_rdi_format/rdi_format.c index f13c0ad1..ef9eea1b 100644 --- a/src/lib_rdi_format/rdi_format.c +++ b/src/lib_rdi_format/rdi_format.c @@ -1,85 +1,174 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -//////////////////////////////// -// Functions +//////////////////////////////////////////////////////////////// +//~ 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_U8 rdi_eval_op_ctrlbits_table[45] = +{ +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(1, 1, 0), +RDI_EVAL_CTRLBITS(1, 0, 0), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(0, 1, 1), +RDI_EVAL_CTRLBITS(1, 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(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(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 *)"Other", sizeof("Other")}, +{(RDI_U8 *)"U", sizeof("U")}, +{(RDI_U8 *)"S", sizeof("S")}, +{(RDI_U8 *)"F32", sizeof("F32")}, +{(RDI_U8 *)"F64", sizeof("F64")}, +{(RDI_U8 *)"COUNT", sizeof("COUNT")}, +}; RDI_PROC RDI_U64 -rdi_hash(RDI_U8 *ptr, RDI_U64 size){ +rdi_hash(RDI_U8 *ptr, RDI_U64 size) +{ RDI_U64 result = 5381; RDI_U8 *opl = ptr + size; - for (; ptr < opl; ptr += 1){ + for(;ptr < opl; ptr += 1) + { result = ((result << 5) + result) + *ptr; } - return(result); + return result; } RDI_PROC RDI_U32 -rdi_size_from_basic_type_kind(RDI_TypeKind kind){ - RDI_U32 result = 0; - switch (kind){ -#define X(N,C) -#define XZ(N,C,Z) case C: result = Z; break; -#define Y(A,N) - RDI_TypeKindXList(X,XZ,Y) -#undef X -#undef XZ -#undef Y - } - return(result); +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_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){ -#define X(N,C,Z) case C: result = Z; break; - RDI_ArchXList(X) -#undef X - } - return(result); +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; } - -//- eval helpers RDI_PROC RDI_EvalConversionKind -rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out){ - RDI_EvalConversionKind result = 0; - switch (in + (out << 8)){ -#define Y(i,o) case ((RDI_EvalTypeGroup_##i) + ((RDI_EvalTypeGroup_##o) << 8)): -#define Xb(c) -#define Xe(c) result = RDI_EvalConversionKind_##c; break; - RDI_EvalConversionKindFromTypeGroupPairMap(Y,Xb,Xe) -#undef Xe -#undef Xb -#undef Y - } - return(result); -} - -RDI_PROC RDI_U8* -rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind conversion_kind, RDI_U64 *lenout){ - RDI_U8 *result = 0; - switch (conversion_kind){ -#define X(N,msg) \ -case RDI_EvalConversionKind_##N: result = (RDI_U8*)msg; *lenout = sizeof(msg) - 1; break; - RDI_EvalConversionKindXList(X) -#undef X - } - return(result); +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_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group) +{ RDI_S32 result = 0; - switch (op){ + 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){ + if(group != RDI_EvalTypeGroup_Other) + { result = 1; } }break; @@ -88,10 +177,20 @@ rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group){ 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){ + if(group == RDI_EvalTypeGroup_S || group == RDI_EvalTypeGroup_U) + { result = 1; } }break; } - return(result); + 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 diff --git a/src/lib_rdi_format/rdi_format.h b/src/lib_rdi_format/rdi_format.h index 4977dec0..ddd1cf7e 100644 --- a/src/lib_rdi_format/rdi_format.h +++ b/src/lib_rdi_format/rdi_format.h @@ -2,7 +2,7 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////////////////////////////////////// -// RAD Debug Info, (R)AD(D)BG(I) Format Library +//~ RAD Debug Info, (R)AD(D)BG(I) Format Library // // Defines standard RDI debug information format types and // functions. @@ -11,14 +11,14 @@ #define RDI_FORMAT_H //////////////////////////////////////////////////////////////// -// Overridable procedure decoration +//~ Overridable Procedure Decoration #if !defined(RDI_PROC) # define RDI_PROC static #endif //////////////////////////////////////////////////////////////// -// Overridable integer types +//~ Overridable Basic Integer Types #if !defined(RDI_U8) # define RDI_U8 RDI_U8 @@ -29,7 +29,6 @@ # 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; @@ -42,479 +41,794 @@ typedef int64_t RDI_S64; #endif //////////////////////////////////////////////////////////////// -// Architecture Constants +//~ Format Constants -#define RDI_ArchXList(X)\ -X(NULL, 0, 0)\ -X(X86, 1, 4)\ -X(X64, 2, 8) - -typedef RDI_U32 RDI_Arch; -typedef enum RDI_ArchEnum{ -#define X(N,C,Z) RDI_Arch_##N = C, - RDI_ArchXList(X) -#undef X -} RDI_ArchEnum; - - -typedef RDI_U8 RDI_RegCode; - -// x86 registers -#define RDI_RegisterCode_X86_XList(X) \ -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) \ -X(COUNT, 61) - -typedef enum RDI_RegisterCode_X86_Enum{ -#define X(N,C) RDI_RegisterCode_X86_##N = C, - RDI_RegisterCode_X86_XList(X) -#undef X -} RDI_RegisterCode_X86_Enum; - -// x64 registers -#define RDI_RegisterCode_X64_XList(X) \ -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(ymm0, 49) \ -X(ymm1, 50) \ -X(ymm2, 51) \ -X(ymm3, 52) \ -X(ymm4, 53) \ -X(ymm5, 54) \ -X(ymm6, 55) \ -X(ymm7, 56) \ -X(ymm8, 57) \ -X(ymm9, 58) \ -X(ymm10, 59) \ -X(ymm11, 60) \ -X(ymm12, 61) \ -X(ymm13, 62) \ -X(ymm14, 63) \ -X(ymm15, 64) \ -X(mxcsr, 65) \ -X(fsbase, 66) \ -X(gsbase, 67) \ -X(fcw, 68) \ -X(fsw, 69) \ -X(ftw, 70) \ -X(fop, 71) \ -X(fcs, 72) \ -X(fds, 73) \ -X(fip, 74) \ -X(fdp, 75) \ -X(mxcsr_mask, 76) \ -X(COUNT, 77) - -typedef enum RDI_RegisterCode_X64_Enum{ -#define X(N,C) RDI_RegisterCode_X64_##N = C, - RDI_RegisterCode_X64_XList(X) -#undef X -} RDI_RegisterCode_X64_Enum; - - -//////////////////////////////////////////////////////////////// -// Format types - -// "raddbg\0\0" +// \"raddbg\0\0\" #define RDI_MAGIC_CONSTANT 0x0000676264646172 #define RDI_ENCODING_VERSION 1 -#define RDI_LanguageXList(X) \ -X(NULL, 0) \ -X(C, 1) \ -X(CPlusPlus, 2) - -typedef RDI_U32 RDI_Language; -typedef enum RDI_LanguageEnum{ -#define X(N,C) RDI_Language_##N = C, - RDI_LanguageXList(X) -#undef X -} RDI_LanguageEnum; - -typedef struct RDI_Header{ - // identification - RDI_U64 magic; - RDI_U32 encoding_version; - - // data sections - RDI_U32 data_section_off; - RDI_U32 data_section_count; -} RDI_Header; - - -//- data sections - -#define RDI_DataSectionTag_SECONDARY 0x80000000 - -#define RDI_DataSectionTagXList(X,Y) \ -X(NULL, 0x0000)\ -X(TopLevelInfo, 0x0001)\ -X(StringData, 0x0002)\ -X(StringTable, 0x0003)\ -X(IndexRuns, 0x0004)\ -X(BinarySections, 0x0005)\ -X(FilePathNodes, 0x0006)\ -X(SourceFiles, 0x0007)\ -X(Units, 0x0008)\ -X(UnitVmap, 0x0009)\ -X(TypeNodes, 0x000A)\ -X(UDTs, 0x000B)\ -X(Members, 0x000C)\ -X(EnumMembers, 0x000D)\ -X(GlobalVariables, 0x000E)\ -X(GlobalVmap, 0x000F)\ -X(ThreadVariables, 0x0010)\ -X(Procedures, 0x0011)\ -X(Scopes, 0x0012)\ -X(ScopeVoffData, 0x0013)\ -X(ScopeVmap, 0x0014)\ -X(Locals, 0x0015)\ -X(LocationBlocks, 0x0016)\ -X(LocationData, 0x0017)\ -X(NameMaps, 0x0018)\ -Y(PRIMARY_COUNT)\ -X(SKIP, RDI_DataSectionTag_SECONDARY|0x0000)\ -X(LineInfoVoffs, RDI_DataSectionTag_SECONDARY|0x0001)\ -X(LineInfoData, RDI_DataSectionTag_SECONDARY|0x0002)\ -X(LineInfoColumns, RDI_DataSectionTag_SECONDARY|0x0003)\ -X(LineMapNumbers, RDI_DataSectionTag_SECONDARY|0x0004)\ -X(LineMapRanges, RDI_DataSectionTag_SECONDARY|0x0005)\ -X(LineMapVoffs, RDI_DataSectionTag_SECONDARY|0x0006)\ -X(NameMapBuckets, RDI_DataSectionTag_SECONDARY|0x0007)\ -X(NameMapNodes, RDI_DataSectionTag_SECONDARY|0x0008) +//////////////////////////////////////////////////////////////// +//~ Format Types & Functions typedef RDI_U32 RDI_DataSectionTag; -typedef enum RDI_DataSectionTagEnum{ -#define X(N,C) RDI_DataSectionTag_##N = C, -#define Y(N) RDI_DataSectionTag_##N, - RDI_DataSectionTagXList(X,Y) -#undef X -#undef Y +typedef enum RDI_DataSectionTagEnum +{ +RDI_DataSectionTag_NULL = 0x0000, +RDI_DataSectionTag_TopLevelInfo = 0x0001, +RDI_DataSectionTag_StringData = 0x0002, +RDI_DataSectionTag_StringTable = 0x0003, +RDI_DataSectionTag_IndexRuns = 0x0004, +RDI_DataSectionTag_BinarySections = 0x0005, +RDI_DataSectionTag_FilePathNodes = 0x0006, +RDI_DataSectionTag_SourceFiles = 0x0007, +RDI_DataSectionTag_Units = 0x0008, +RDI_DataSectionTag_UnitVmap = 0x0009, +RDI_DataSectionTag_TypeNodes = 0x000A, +RDI_DataSectionTag_UDTs = 0x000B, +RDI_DataSectionTag_Members = 0x000C, +RDI_DataSectionTag_EnumMembers = 0x000D, +RDI_DataSectionTag_GlobalVariables = 0x000E, +RDI_DataSectionTag_GlobalVmap = 0x000F, +RDI_DataSectionTag_ThreadVariables = 0x0010, +RDI_DataSectionTag_Procedures = 0x0011, +RDI_DataSectionTag_Scopes = 0x0012, +RDI_DataSectionTag_ScopeVoffData = 0x0013, +RDI_DataSectionTag_ScopeVmap = 0x0014, +RDI_DataSectionTag_Locals = 0x0015, +RDI_DataSectionTag_LocationBlocks = 0x0016, +RDI_DataSectionTag_LocationData = 0x0017, +RDI_DataSectionTag_NameMaps = 0x0018, +RDI_DataSectionTag_PRIMARY_COUNT = 0x0019, +RDI_DataSectionTag_SECONDARY = 0x80000000, +RDI_DataSectionTag_LineInfoVoffs = RDI_DataSectionTag_SECONDARY|0x0001, +RDI_DataSectionTag_LineInfoData = RDI_DataSectionTag_SECONDARY|0x0002, +RDI_DataSectionTag_LineInfoColumns = RDI_DataSectionTag_SECONDARY|0x0003, +RDI_DataSectionTag_LineMapNumbers = RDI_DataSectionTag_SECONDARY|0x0004, +RDI_DataSectionTag_LineMapRanges = RDI_DataSectionTag_SECONDARY|0x0005, +RDI_DataSectionTag_LineMapVoffs = RDI_DataSectionTag_SECONDARY|0x0006, +RDI_DataSectionTag_NameMapBuckets = RDI_DataSectionTag_SECONDARY|0x0007, +RDI_DataSectionTag_NameMapNodes = RDI_DataSectionTag_SECONDARY|0x0008, } RDI_DataSectionTagEnum; - -#define RDI_DataSectionEncodingXList(X) \ -X(Unpacked, 0)\ -X(LZB, 1) - typedef RDI_U32 RDI_DataSectionEncoding; -typedef enum RDI_DataSectionEncodingEnum{ -#define X(N,C) RDI_DataSectionEncoding_##N = C, - RDI_DataSectionEncodingXList(X) -#undef X +typedef enum RDI_DataSectionEncodingEnum +{ +RDI_DataSectionEncoding_Unpacked = 0, +RDI_DataSectionEncoding_LZB = 1, } RDI_DataSectionEncodingEnum; -typedef struct RDI_DataSection{ - RDI_DataSectionTag tag; - RDI_DataSectionEncoding encoding; - RDI_U64 off; - RDI_U64 encoded_size; - RDI_U64 unpacked_size; -} RDI_DataSection; +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; -//- common types -typedef struct RDI_VMapEntry{ - RDI_U64 voff; - RDI_U64 idx; -} RDI_VMapEntry; +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; -//- top level info -typedef struct RDI_TopLevelInfo{ - RDI_Arch arch; - RDI_U32 exe_name_string_idx; - RDI_U64 exe_hash; - RDI_U64 voff_max; -} RDI_TopLevelInfo; +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_ymm0 = 49, +RDI_RegCodeX64_ymm1 = 50, +RDI_RegCodeX64_ymm2 = 51, +RDI_RegCodeX64_ymm3 = 52, +RDI_RegCodeX64_ymm4 = 53, +RDI_RegCodeX64_ymm5 = 54, +RDI_RegCodeX64_ymm6 = 55, +RDI_RegCodeX64_ymm7 = 56, +RDI_RegCodeX64_ymm8 = 57, +RDI_RegCodeX64_ymm9 = 58, +RDI_RegCodeX64_ymm10 = 59, +RDI_RegCodeX64_ymm11 = 60, +RDI_RegCodeX64_ymm12 = 61, +RDI_RegCodeX64_ymm13 = 62, +RDI_RegCodeX64_ymm14 = 63, +RDI_RegCodeX64_ymm15 = 64, +RDI_RegCodeX64_mxcsr = 65, +RDI_RegCodeX64_fsbase = 66, +RDI_RegCodeX64_gsbase = 67, +RDI_RegCodeX64_fcw = 68, +RDI_RegCodeX64_fsw = 69, +RDI_RegCodeX64_ftw = 70, +RDI_RegCodeX64_fop = 71, +RDI_RegCodeX64_fcs = 72, +RDI_RegCodeX64_fds = 73, +RDI_RegCodeX64_fip = 74, +RDI_RegCodeX64_fdp = 75, +RDI_RegCodeX64_mxcsr_mask = 76, +} RDI_RegCodeX64Enum; -//- binary sections typedef RDI_U32 RDI_BinarySectionFlags; -typedef enum RDI_BinarySectionFlagsEnum{ - RDI_BinarySectionFlag_Read = (1 << 0), - RDI_BinarySectionFlag_Write = (1 << 1), - RDI_BinarySectionFlag_Execute = (1 << 2) +typedef enum RDI_BinarySectionFlagsEnum +{ +RDI_BinarySectionFlag_Read = 1<<0, +RDI_BinarySectionFlag_Write = 1<<1, +RDI_BinarySectionFlag_Execute = 1<<2, } RDI_BinarySectionFlagsEnum; -typedef 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; -} RDI_BinarySection; - -//- file & file system info -typedef 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; -} RDI_FilePathNode; - -typedef struct RDI_SourceFile{ - RDI_U32 file_path_node_idx; - - RDI_U32 normal_full_path_string_idx; - - // usage of line map to go from a line number to an array of voffs - // (line_map_nums * line_number) -> (nil | index) - // (line_map_data * index) -> (range) - // (line_map_voff_data * range) -> (array(voff)) - - RDI_U32 line_map_count; - RDI_U32 line_map_nums_data_idx; // U32[line_map_count] (sorted - not closed ranges) - RDI_U32 line_map_range_data_idx; // U32[line_map_count + 1] (pairs form ranges) - RDI_U32 line_map_voff_data_idx; // U64[...] (idx by line_map_range_data) -} RDI_SourceFile; - - -//- units & line info -typedef 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; - - // usage of line info to go from voff to file & line number: - // (line_info_voffs * voff) -> (nil + index) - // (line_info_data * index) -> (RDI_Line = (file_idx * line_number)) - - RDI_U32 line_info_voffs_data_idx; // U64[line_info_count + 1] (sorted ranges) - RDI_U32 line_info_data_idx; // RDI_Line[line_info_count] - RDI_U32 line_info_col_data_idx; // RDI_Col[line_info_count] - RDI_U32 line_info_count; -} RDI_Unit; - -typedef struct RDI_Line{ - RDI_U32 file_idx; - RDI_U32 line_num; -} RDI_Line; - -typedef struct RDI_Column{ - RDI_U16 col_first; - RDI_U16 col_opl; -} RDI_Column; - - -//- type info - -// X(name,code) - defines a primary code -// XZ(name,code size) - defines a primary code & associates a size -// Y(alias_name,name) - defines an alias for bookends -#define RDI_TypeKindXList(X,XZ,Y)\ -X(NULL, 0x0000) \ -\ -XZ(Void, 0x0001, 0) Y(FirstBuiltIn, Void) \ -XZ(Handle, 0x0002, 0xFFFFFFFF) \ -XZ(Char8, 0x0003, 1)\ -XZ(Char16, 0x0004, 2) \ -XZ(Char32, 0x0005, 4) \ -XZ(UChar8, 0x0006, 1) \ -XZ(UChar16, 0x0007, 2) \ -XZ(UChar32, 0x0008, 4) \ -XZ(U8, 0x0009, 1) \ -XZ(U16, 0x000A, 2) \ -XZ(U32, 0x000B, 4) \ -XZ(U64, 0x000C, 8) \ -XZ(U128, 0x000D, 16) \ -XZ(U256, 0x000E, 32) \ -XZ(U512, 0x000F, 64) \ -XZ(S8, 0x0010, 1) \ -XZ(S16, 0x0011, 2) \ -XZ(S32, 0x0012, 4) \ -XZ(S64, 0x0013, 8) \ -XZ(S128, 0x0014, 16) \ -XZ(S256, 0x0015, 32) \ -XZ(S512, 0x0016, 64) \ -XZ(Bool, 0x0017, 1) \ -XZ(F16, 0x0018, 2) \ -XZ(F32, 0x0019, 4) \ -XZ(F32PP, 0x001A, 4) \ -XZ(F48, 0x001B, 6) \ -XZ(F64, 0x001C, 8) \ -XZ(F80, 0x001D, 10) \ -XZ(F128, 0x001E, 16) \ -XZ(ComplexF32, 0x001F, 8) \ -XZ(ComplexF64, 0x0020, 16) \ -XZ(ComplexF80, 0x0021, 20) \ -XZ(ComplexF128, 0x0022, 32) Y(LastBuiltIn, ComplexF128) \ -\ -X(Modifier, 0x1000) Y(FirstConstructed, Modifier) \ -X(Ptr, 0x1001) \ -X(LRef, 0x1002) \ -X(RRef, 0x1003) \ -X(Array, 0x1004) \ -X(Function, 0x1005) \ -X(Method, 0x1006) \ -X(MemberPtr, 0x1007) Y(LastConstructed, MemberPtr) \ -\ -X(Struct, 0x2000) Y(FirstUserDefined, Struct) Y(FirstRecord, Struct) \ -X(Class, 0x2001) \ -X(Union, 0x2002) Y(LastRecord, Union) \ -X(Enum, 0x2003) \ -X(Alias, 0x2004) \ -X(IncompleteStruct, 0x2005) Y(FirstIncomplete, IncompleteStruct) \ -X(IncompleteUnion, 0x2006) \ -X(IncompleteClass, 0x2007) \ -X(IncompleteEnum, 0x2008) Y(LastIncomplete, IncompleteEnum) \ -Y(LastUserDefined, IncompleteEnum) \ -\ -X(Bitfield, 0xF000) \ -X(Variadic, 0xF001) +typedef RDI_U32 RDI_Language; +typedef enum RDI_LanguageEnum +{ +RDI_Language_NULL = 0, +RDI_Language_C = 1, +RDI_Language_CPlusPlus = 2, +RDI_Language_COUNT = 3, +} RDI_LanguageEnum; typedef RDI_U16 RDI_TypeKind; -typedef enum RDI_TypeKindEnum{ - -#define X(name,code) RDI_TypeKind_##name = code, -#define XZ(name,code,size) X(name,code) -#define Y(alias_name,name) RDI_TypeKind_##alias_name = RDI_TypeKind_##name, - RDI_TypeKindXList(X,XZ,Y) -#undef X -#undef XZ -#undef Y - +typedef enum RDI_TypeKindEnum +{ +RDI_TypeKind_NULL = 0x0000, +RDI_TypeKind_Void = 0x0001, +RDI_TypeKind_Handle = 0x0002, +RDI_TypeKind_Char8 = 0x0003, +RDI_TypeKind_Char16 = 0x0004, +RDI_TypeKind_Char32 = 0x0005, +RDI_TypeKind_UChar8 = 0x0006, +RDI_TypeKind_UChar16 = 0x0007, +RDI_TypeKind_UChar32 = 0x0008, +RDI_TypeKind_U8 = 0x0009, +RDI_TypeKind_U16 = 0x000A, +RDI_TypeKind_U32 = 0x000B, +RDI_TypeKind_U64 = 0x000C, +RDI_TypeKind_U128 = 0x000D, +RDI_TypeKind_U256 = 0x000E, +RDI_TypeKind_U512 = 0x000F, +RDI_TypeKind_S8 = 0x0010, +RDI_TypeKind_S16 = 0x0011, +RDI_TypeKind_S32 = 0x0012, +RDI_TypeKind_S64 = 0x0013, +RDI_TypeKind_S128 = 0x0014, +RDI_TypeKind_S256 = 0x0015, +RDI_TypeKind_S512 = 0x0016, +RDI_TypeKind_Bool = 0x0017, +RDI_TypeKind_F16 = 0x0018, +RDI_TypeKind_F32 = 0x0019, +RDI_TypeKind_F32PP = 0x001A, +RDI_TypeKind_F48 = 0x001B, +RDI_TypeKind_F64 = 0x001C, +RDI_TypeKind_F80 = 0x001D, +RDI_TypeKind_F128 = 0x001E, +RDI_TypeKind_ComplexF32 = 0x001F, +RDI_TypeKind_ComplexF64 = 0x0020, +RDI_TypeKind_ComplexF80 = 0x0021, +RDI_TypeKind_ComplexF128 = 0x0022, +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_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; -enum{ - RDI_TypeModifierFlag_Const = (1 << 0), - RDI_TypeModifierFlag_Volatile = (1 << 1), +typedef enum RDI_TypeModifierFlagsEnum +{ +RDI_TypeModifierFlag_Const = 1<<0, +RDI_TypeModifierFlag_Volatile = 1<<1, +} 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_Abs = 16, +RDI_EvalOp_Neg = 17, +RDI_EvalOp_Add = 18, +RDI_EvalOp_Sub = 19, +RDI_EvalOp_Mul = 20, +RDI_EvalOp_Div = 21, +RDI_EvalOp_Mod = 22, +RDI_EvalOp_LShift = 23, +RDI_EvalOp_RShift = 24, +RDI_EvalOp_BitAnd = 25, +RDI_EvalOp_BitOr = 26, +RDI_EvalOp_BitXor = 27, +RDI_EvalOp_BitNot = 28, +RDI_EvalOp_LogAnd = 29, +RDI_EvalOp_LogOr = 30, +RDI_EvalOp_LogNot = 31, +RDI_EvalOp_EqEq = 32, +RDI_EvalOp_NtEq = 33, +RDI_EvalOp_LsEq = 34, +RDI_EvalOp_GrEq = 35, +RDI_EvalOp_Less = 36, +RDI_EvalOp_Grtr = 37, +RDI_EvalOp_Trunc = 38, +RDI_EvalOp_TruncSigned = 39, +RDI_EvalOp_Convert = 40, +RDI_EvalOp_Pick = 41, +RDI_EvalOp_Pop = 42, +RDI_EvalOp_Insert = 43, +RDI_EvalOp_COUNT = 44, +} 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_Procedures = 3, +RDI_NameMapKind_Types = 4, +RDI_NameMapKind_LinkNameProcedures = 5, +RDI_NameMapKind_NormalSourcePaths = 6, +RDI_NameMapKind_COUNT = 7, +} RDI_NameMapKindEnum; + +#define RDI_DataSectionTag_XList \ +X(NULL)\ +X(TopLevelInfo)\ +X(StringData)\ +X(StringTable)\ +X(IndexRuns)\ +X(BinarySections)\ +X(FilePathNodes)\ +X(SourceFiles)\ +X(Units)\ +X(UnitVmap)\ +X(TypeNodes)\ +X(UDTs)\ +X(Members)\ +X(EnumMembers)\ +X(GlobalVariables)\ +X(GlobalVmap)\ +X(ThreadVariables)\ +X(Procedures)\ +X(Scopes)\ +X(ScopeVoffData)\ +X(ScopeVmap)\ +X(Locals)\ +X(LocationBlocks)\ +X(LocationData)\ +X(NameMaps)\ +X(PRIMARY_COUNT)\ +X(SECONDARY)\ +X(LineInfoVoffs)\ +X(LineInfoData)\ +X(LineInfoColumns)\ +X(LineMapNumbers)\ +X(LineMapRanges)\ +X(LineMapVoffs)\ +X(NameMapBuckets)\ +X(NameMapNodes)\ + +#define RDI_DataSectionEncoding_XList \ +X(Unpacked)\ +X(LZB)\ + +#define RDI_Arch_XList \ +X(NULL)\ +X(X86)\ +X(X64)\ + +#define RDI_BinarySectionFlags_XList \ +X(NULL)\ +X(X86)\ +X(X64)\ + +#define RDI_Language_XList \ +X(NULL)\ +X(C)\ +X(CPlusPlus)\ +X(COUNT)\ + +#define RDI_TypeKind_XList \ +X(NULL)\ +X(Void)\ +X(Handle)\ +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)\ + +#define RDI_TypeModifierFlags_XList \ +X(Const)\ +X(Volatile)\ + +#define RDI_UDTFlag_XList \ +X(EnumMembers)\ + +#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_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_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(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(COUNT)\ + +#define RDI_EvalTypeGroup_XList \ +X(Other)\ +X(U)\ +X(S)\ +X(F32)\ +X(F64)\ +X(COUNT)\ + +#define RDI_EvalConversionKind_XList \ +X(Noop)\ +X(Legal)\ +X(OtherToOther)\ +X(ToOther)\ +X(FromOther)\ +X(COUNT)\ + +#define RDI_NameMapKind_XList \ +X(NULL)\ +X(GlobalVariables)\ +X(ThreadVariables)\ +X(Procedures)\ +X(Types)\ +X(LinkNameProcedures)\ +X(NormalSourcePaths)\ +X(COUNT)\ + +#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) ((decodeN) | ((popN) << 4) | ((pushN) << 6)) +#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) ((ctrlbits) & 0xf) +#define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0x3) +#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 6) & 0x3) +#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; }; -// IMPORTANT NOTE: All type nodes in a valid raddbg are *topologically sorted*. -// That means any time a type node refers to another type node, the type node -// it refers to has an index less than or equal to the index of the node that -// is doing the referring. It is never the case that a type node depends on a -// node that comes later in the type node array. -// This restriction does not apply to the members of a type that are -// attached through a "UDT" though. +typedef struct RDI_DataSection RDI_DataSection; +struct RDI_DataSection +{ +RDI_DataSectionTag tag; +RDI_DataSectionEncoding encoding; +RDI_U64 off; +RDI_U64 encoded_size; +RDI_U64 unpacked_size; +}; -typedef struct RDI_TypeNode{ - RDI_TypeKind kind; - // when kind is 'Modifier' -> RDI_TypeModifierFlags - RDI_U16 flags; - - RDI_U32 byte_size; - - union{ +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; +}; + +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 line_map_count; +RDI_U32 line_map_nums_data_idx; +RDI_U32 line_map_range_data_idx; +RDI_U32 line_map_voff_data_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_info_voffs_data_idx; +RDI_U32 line_info_data_idx; +RDI_U32 line_info_col_data_idx; +RDI_U32 line_info_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_TypeNode RDI_TypeNode; +struct RDI_TypeNode +{ +RDI_TypeKind kind; +RDI_U16 flags; +RDI_U32 byte_size; + + union + { // kind is 'built-in' - struct{ + struct + { RDI_U32 name_string_idx; } built_in; // kind is 'constructed' - struct{ + struct + { RDI_U32 direct_type_idx; RDI_U32 count; union{ @@ -526,402 +840,170 @@ typedef struct RDI_TypeNode{ } constructed; // kind is 'user defined' - struct{ + struct + { RDI_U32 name_string_idx; RDI_U32 direct_type_idx; RDI_U32 udt_idx; } user_defined; // (kind = Bitfield) - struct{ + struct + { RDI_U32 direct_type_idx; RDI_U32 off; RDI_U32 size; } bitfield; - }; -} RDI_TypeNode; - -typedef RDI_U32 RDI_UDTFlags; -enum{ - RDI_UDTFlag_EnumMembers = (1 << 0), + } + ; }; -typedef struct RDI_UDT{ - RDI_U32 self_type_idx; - RDI_UDTFlags flags; - - // when EnumMembers flag is set, indexes into enum "enum_members" instead of "members" - RDI_U32 member_first; - RDI_U32 member_count; - - RDI_U32 file_idx; - RDI_U32 line; - RDI_U32 col; -} RDI_UDT; - -#define RDI_MemberKindXList(X) \ -X(NULL, 0x0000) \ -X(DataField, 0x0001) \ -X(StaticData, 0x0002) \ -X(Method, 0x0100) \ -X(StaticMethod, 0x0101) \ -X(VirtualMethod, 0x0102) \ -X(VTablePtr, 0x0200) \ -X(Base, 0x0201) \ -X(VirtualBase, 0x0202) \ -X(NestedType, 0x0300) - -typedef RDI_U16 RDI_MemberKind; -typedef enum RDI_MemberKindEnum{ -#define X(N,C) RDI_MemberKind_##N = C, - RDI_MemberKindXList(X) -#undef X -} RDI_MemberKindEnum; - -// TODO(allen): need a way to equip methods and some virtual methods -// with procedure symbol information. I'm thinking a seperate data -// array of (MemberIdx,ProcSymbolIdx) sorted by MemberIdx. Or just a -// parallel array. Putting them right into this struct looks like it -// would complicate the converters because we tend to want an API -// like 'associate_method_to_proc' that can be used *after* both the -// method and proc are known, rather than one that forces us to know -// the association when constructing the member data. -typedef struct RDI_Member{ - RDI_MemberKind kind; - RDI_U16 __unused__; - - RDI_U32 name_string_idx; - RDI_U32 type_idx; - RDI_U32 off; -} RDI_Member; - -typedef struct RDI_EnumMember{ - RDI_U32 name_string_idx; - RDI_U32 __unused__; - RDI_U64 val; -} RDI_EnumMember; - - -//- symbol info -typedef RDI_U32 RDI_LinkFlags; -enum{ - RDI_LinkFlag_External = (1 << 0), - // NOTE: Scope flags are mutually exclusive. - // A symbol is either global scoped, type scoped, or procedure scoped. - RDI_LinkFlag_TypeScoped = (1 << 1), - RDI_LinkFlag_ProcScoped = (1 << 2), +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_GlobalVariable{ - RDI_U32 name_string_idx; - // NOTE: "global variables" can be scoped in *any* way. The scope flags here refer to - // *namespace* scoping. "global variables" are all in the data section of the - // final exe/dll type file, so they are "global" in the life-time sense of the - // word. In the namespace sense of the word, they can be scoped globally, by type, - // or by procedure. - RDI_LinkFlags link_flags; - RDI_U64 voff; - RDI_U32 type_idx; - - // container_idx: UDT for "TypeScoped", Procedure for "ProcScoped" - RDI_U32 container_idx; -} RDI_GlobalVariable; - -typedef struct RDI_ThreadVariable{ - RDI_U32 name_string_idx; - // NOTE: See the note in GlobalVariable regarding scoping. The same concept applies here. - RDI_LinkFlags link_flags; - RDI_U32 tls_off; - RDI_U32 type_idx; - - // container_idx: UDT for "TypeScoped", Procedure for "ProcScoped" - RDI_U32 container_idx; -} RDI_ThreadVariable; - -typedef struct RDI_Procedure{ - RDI_U32 name_string_idx; - RDI_U32 link_name_string_idx; - // NOTE: See the note in GlobalVariable regarding scoping. The same concept applies here. - RDI_LinkFlags link_flags; - RDI_U32 type_idx; - RDI_U32 root_scope_idx; - - // container_idx: UDT for "TypeScoped", Procedure for "ProcScoped" - RDI_U32 container_idx; -} RDI_Procedure; - -typedef 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; - - // indexes into "locals" - RDI_U32 local_first; - RDI_U32 local_count; - - RDI_U32 static_local_idx_run_first; - RDI_U32 static_local_count; - - // TODO(allen): attach less common scope-relevant info -} RDI_Scope; - -typedef RDI_U32 RDI_LocalKind; -typedef enum{ - RDI_LocalKind_NULL, - RDI_LocalKind_Parameter, - RDI_LocalKind_Variable, - RDI_LocalKind_COUNT -} RDI_LocalKindEnum; - -typedef struct RDI_Local{ - RDI_LocalKind kind; - RDI_U32 name_string_idx; - RDI_U64 type_idx; - // indexes into "location_blocks" - RDI_U32 location_first; - RDI_U32 location_opl; -} RDI_Local; - -typedef struct RDI_LocationBlock{ - RDI_U32 scope_off_first; - RDI_U32 scope_off_opl; - RDI_U32 location_data_off; -} RDI_LocationBlock; - -typedef RDI_U8 RDI_LocationKind; -typedef enum{ - RDI_LocationKind_NULL, - RDI_LocationKind_AddrBytecodeStream, - RDI_LocationKind_ValBytecodeStream, - RDI_LocationKind_AddrRegPlusU16, - RDI_LocationKind_AddrAddrRegPlusU16, - RDI_LocationKind_ValReg, - RDI_LocationKind_COUNT -} RDI_LocationKindEnum; - -typedef struct RDI_LocationBytecodeStream{ - RDI_LocationKind kind; - // [... 0] null terminated byte sequence RDI_EvalBytecodeStream -} RDI_LocationBytecodeStream; - -typedef struct RDI_LocationRegPlusU16{ - RDI_LocationKind kind; - RDI_RegCode reg_code; - RDI_U16 offset; -} RDI_LocationRegPlusU16; - -typedef struct RDI_LocationReg{ - RDI_LocationKind kind; - RDI_RegCode reg_code; -} RDI_LocationReg; - -//- name map types -#define RDI_NameMapXList(X)\ -X(NULL, 0)\ -X(GlobalVariables, 1)\ -X(ThreadVariables, 2)\ -X(Procedures, 3)\ -X(Types, 4)\ -X(LinkNameProcedures, 5)\ -X(NormalSourcePaths, 6) - -typedef RDI_U32 RDI_NameMapKind; -typedef enum RDI_NameMapKindEnum{ -#define X(N,C) RDI_NameMapKind_##N = C, - RDI_NameMapXList(X) -#undef X - - RDI_NameMapKind_COUNT -} RDI_NameMapKindEnum; - -// TODO(allen): documentation here for the hashing and probing strategy for this table - -typedef struct RDI_NameMap{ - RDI_NameMapKind kind; - RDI_U32 bucket_data_idx; - RDI_U32 node_data_idx; -} RDI_NameMap; - -typedef struct RDI_NameMapBucket{ - RDI_U32 first_node; - RDI_U32 node_count; -} RDI_NameMapBucket; - -typedef struct RDI_NameMapNode{ - RDI_U32 string_idx; - RDI_U32 match_count; - // NOTE: if (match_count == 1) then this is the index of the matching item - // if (match_count > 1) then this is the first for an index run of all the matches - RDI_U32 match_idx_or_idx_run_first; -} RDI_NameMapNode; - - -//////////////////////////////// -// Eval Bytecode - -// (Name, decodeN, popN, pushN) -#define RDI_EvalOpXList(X)\ -X(Stop, 0, 0, 0)\ -X(Noop, 0, 0, 0)\ -X(Cond, 1, 1, 0)\ -X(Skip, 1, 0, 0)\ -X(MemRead, 1, 1, 1)\ -X(RegRead, 4, 0, 1)\ -X(RegReadDyn, 0, 1, 1)\ -X(FrameOff, 1, 0, 1)\ -X(ModuleOff, 4, 0, 1)\ -X(TLSOff, 4, 0, 1)\ -X(ObjectOff, 0, 0, 0)\ -X(CFA, 0, 0, 0)\ -X(ConstU8, 1, 0, 1)\ -X(ConstU16, 2, 0, 1)\ -X(ConstU32, 4, 0, 1)\ -X(ConstU64, 8, 0, 1)\ -X(Abs, 1, 1, 1)\ -X(Neg, 1, 1, 1)\ -X(Add, 1, 2, 1)\ -X(Sub, 1, 2, 1)\ -X(Mul, 1, 2, 1)\ -X(Div, 1, 2, 1)\ -X(Mod, 1, 2, 1)\ -X(LShift, 1, 2, 1)\ -X(RShift, 1, 2, 1)\ -X(BitAnd, 1, 2, 1)\ -X(BitOr, 1, 2, 1)\ -X(BitXor, 1, 2, 1)\ -X(BitNot, 1, 1, 1)\ -X(LogAnd, 1, 2, 1)\ -X(LogOr, 1, 2, 1)\ -X(LogNot, 1, 1, 1)\ -X(EqEq, 1, 2, 1)\ -X(NtEq, 1, 2, 1)\ -X(LsEq, 1, 2, 1)\ -X(GrEq, 1, 2, 1)\ -X(Less, 1, 2, 1)\ -X(Grtr, 1, 2, 1)\ -X(Trunc, 1, 1, 1)\ -X(TruncSigned, 1, 1, 1)\ -X(Convert, 2, 1, 1)\ -X(Pick, 1, 0, 1)\ -X(Pop, 0, 1, 0)\ -X(Insert, 1, 0, 0) - -// (Name) -#define RDI_EvalTypeGroupXList(X)\ -X(Other)\ -X(U)\ -X(S)\ -X(F32)\ -X(F64) - -// (Name, error-message) -#define RDI_EvalConversionKindXList(X)\ -X(Noop, "")\ -X(Legal, "")\ -X(OtherToOther, "cannot convert between these types")\ -X(ToOther, "cannot convert to this type")\ -X(FromOther, "cannot convert this type") - -// Xb(EvalTypeGroup) Y(TypeKind) Xe(EvalTypeGroup) -#define RDI_EvalTypeGroupFromKindMap(Y,Xb,Xe)\ -\ -Xb(U) Y(U8) Y(U16) Y(U32) Y(U64) Y(Bool) Y(Ptr) Y(Enum)\ -Xe(U)\ -\ -Xb(S) Y(S8) Y(S16) Y(S32) Y(S64)\ -Xe(S)\ -\ -Xb(F32) Y(F32)\ -Xe(F32)\ -\ -Xb(F64) Y(F64)\ -Xe(F64) - -// Xb(EvalConversionKind) Y(EvalTypeGroup, EvalTypeGroup) Xe(EvalConversionKind) -#define RDI_EvalConversionKindFromTypeGroupPairMap(Y,Xb,Xe)\ -\ -Xb(Noop) Y(U, U) Y(S, S) Y(F32, F32) Y(F64, F64) Y(U, S) Y(S, U)\ -Xe(Noop)\ -\ -Xb(Legal)\ -Y(U, F32) Y(S, F32) Y(F32, U) Y(F32, S)\ -Y(U, F64) Y(S, F64) Y(F64, U) Y(F64, S)\ -Y(F32, F64) Y(F64, F32)\ -Xe(Legal)\ -\ -Xb(OtherToOther) Y(Other, Other)\ -Xe(OtherToOther)\ -\ -Xb(ToOther) Y(U, Other) Y(S, Other) Y(F32, Other) Y(F64, Other)\ -Xe(ToOther)\ -\ -Xb(FromOther) Y(Other, U) Y(Other, S) Y(Other, F32) Y(Other, F64)\ -Xe(FromOther) - -// eval interpretation macros -#define RDI_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16)) - - -// eval enums -typedef RDI_U8 RDI_EvalOp; - -typedef enum RDI_EvalOpEnum{ -#define X(N,dec,pop,push) RDI_EvalOp_##N, - RDI_EvalOpXList(X) -#undef X - - RDI_EvalOp_COUNT -} RDI_EvalOpEnum; - - -typedef RDI_U8 RDI_EvalTypeGroup; - -typedef enum RDI_EvalTypeGroupEnum{ -#define X(N) RDI_EvalTypeGroup_##N, - RDI_EvalTypeGroupXList(X) -#undef X - RDI_EvalTypeGroup_COUNT, -} RDI_EvalTypeGroupEnum; - - -typedef RDI_U8 RDI_EvalConversionKind; - -typedef enum RDI_EvalConversionKindEnum{ -#define X(N,msg) RDI_EvalConversionKind_##N, - RDI_EvalConversionKindXList(X) -#undef X - RDI_EvalConversionKind_COUNT, -} RDI_EvalConversionKindEnum; - - -//- eval data tables - -#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) ((decodeN) | ((popN) << 4) | ((pushN) << 6)) -#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) ((ctrlbits) & 0xf) -#define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0x3) -#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 6) & 0x3) - -static RDI_U8 rdi_eval_op_ctrlbits_table[] = { -#define X(Name, decodeN, popN, pushN) RDI_EVAL_CTRLBITS(decodeN,popN,pushN), - RDI_EvalOpXList(X) -#undef X +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; }; -//////////////////////////////// -// Functions +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_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; +}; + +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; +}; + +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_NameMapKind kind; +RDI_U32 bucket_data_idx; +RDI_U32 node_data_idx; +}; + +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; +}; RDI_PROC RDI_U64 rdi_hash(RDI_U8 *ptr, RDI_U64 size); 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); - -//- eval helpers - RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out); -RDI_PROC RDI_U8* rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind conversion_kind, RDI_U64 *lennout); 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_U8 rdi_eval_op_ctrlbits_table[45]; #endif // RDI_FORMAT_H diff --git a/src/metagen/metagen_main.c b/src/metagen/metagen_main.c index 1f3f5401..1ff486e8 100644 --- a/src/metagen/metagen_main.c +++ b/src/metagen/metagen_main.c @@ -515,12 +515,17 @@ int main(int argument_count, char **arguments) for(MG_LayerNode *n = slot->first; n != 0; n = n->next) { MG_Layer *layer = &n->v; - String8 gen_folder = str8_lit("generated"); + String8 layer_generated_folder = {0}; if(layer->gen_folder_name.size != 0) { - gen_folder = layer->gen_folder_name; + String8 gen_folder = layer->gen_folder_name; + layer_generated_folder = push_str8f(mg_arena, "%S/%S", code_dir_path, gen_folder); + } + else + { + String8 gen_folder = str8_lit("generated"); + layer_generated_folder = push_str8f(mg_arena, "%S/%S/%S", code_dir_path, layer->key, gen_folder); } - String8 layer_generated_folder = push_str8f(mg_arena, "%S/%S/%S", code_dir_path, layer->key, gen_folder); if(os_make_directory(layer_generated_folder)) { String8List layer_key_parts = str8_split_path(mg_arena, layer->key); diff --git a/src/rdi_format/lib/rdi_format.c b/src/rdi_format/lib/rdi_format.c deleted file mode 100644 index ef9eea1b..00000000 --- a/src/rdi_format/lib/rdi_format.c +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright (c) 2024 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_U8 rdi_eval_op_ctrlbits_table[45] = -{ -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(1, 1, 0), -RDI_EVAL_CTRLBITS(1, 0, 0), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(0, 1, 1), -RDI_EVAL_CTRLBITS(1, 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(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(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 *)"Other", sizeof("Other")}, -{(RDI_U8 *)"U", sizeof("U")}, -{(RDI_U8 *)"S", sizeof("S")}, -{(RDI_U8 *)"F32", sizeof("F32")}, -{(RDI_U8 *)"F64", sizeof("F64")}, -{(RDI_U8 *)"COUNT", sizeof("COUNT")}, -}; - -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_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_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 diff --git a/src/rdi_format/lib/rdi_format.h b/src/rdi_format/lib/rdi_format.h deleted file mode 100644 index ddd1cf7e..00000000 --- a/src/rdi_format/lib/rdi_format.h +++ /dev/null @@ -1,1009 +0,0 @@ -// Copyright (c) 2024 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 - -//////////////////////////////////////////////////////////////// -//~ Format Constants - -// \"raddbg\0\0\" -#define RDI_MAGIC_CONSTANT 0x0000676264646172 -#define RDI_ENCODING_VERSION 1 - -//////////////////////////////////////////////////////////////// -//~ Format Types & Functions - -typedef RDI_U32 RDI_DataSectionTag; -typedef enum RDI_DataSectionTagEnum -{ -RDI_DataSectionTag_NULL = 0x0000, -RDI_DataSectionTag_TopLevelInfo = 0x0001, -RDI_DataSectionTag_StringData = 0x0002, -RDI_DataSectionTag_StringTable = 0x0003, -RDI_DataSectionTag_IndexRuns = 0x0004, -RDI_DataSectionTag_BinarySections = 0x0005, -RDI_DataSectionTag_FilePathNodes = 0x0006, -RDI_DataSectionTag_SourceFiles = 0x0007, -RDI_DataSectionTag_Units = 0x0008, -RDI_DataSectionTag_UnitVmap = 0x0009, -RDI_DataSectionTag_TypeNodes = 0x000A, -RDI_DataSectionTag_UDTs = 0x000B, -RDI_DataSectionTag_Members = 0x000C, -RDI_DataSectionTag_EnumMembers = 0x000D, -RDI_DataSectionTag_GlobalVariables = 0x000E, -RDI_DataSectionTag_GlobalVmap = 0x000F, -RDI_DataSectionTag_ThreadVariables = 0x0010, -RDI_DataSectionTag_Procedures = 0x0011, -RDI_DataSectionTag_Scopes = 0x0012, -RDI_DataSectionTag_ScopeVoffData = 0x0013, -RDI_DataSectionTag_ScopeVmap = 0x0014, -RDI_DataSectionTag_Locals = 0x0015, -RDI_DataSectionTag_LocationBlocks = 0x0016, -RDI_DataSectionTag_LocationData = 0x0017, -RDI_DataSectionTag_NameMaps = 0x0018, -RDI_DataSectionTag_PRIMARY_COUNT = 0x0019, -RDI_DataSectionTag_SECONDARY = 0x80000000, -RDI_DataSectionTag_LineInfoVoffs = RDI_DataSectionTag_SECONDARY|0x0001, -RDI_DataSectionTag_LineInfoData = RDI_DataSectionTag_SECONDARY|0x0002, -RDI_DataSectionTag_LineInfoColumns = RDI_DataSectionTag_SECONDARY|0x0003, -RDI_DataSectionTag_LineMapNumbers = RDI_DataSectionTag_SECONDARY|0x0004, -RDI_DataSectionTag_LineMapRanges = RDI_DataSectionTag_SECONDARY|0x0005, -RDI_DataSectionTag_LineMapVoffs = RDI_DataSectionTag_SECONDARY|0x0006, -RDI_DataSectionTag_NameMapBuckets = RDI_DataSectionTag_SECONDARY|0x0007, -RDI_DataSectionTag_NameMapNodes = RDI_DataSectionTag_SECONDARY|0x0008, -} RDI_DataSectionTagEnum; - -typedef RDI_U32 RDI_DataSectionEncoding; -typedef enum RDI_DataSectionEncodingEnum -{ -RDI_DataSectionEncoding_Unpacked = 0, -RDI_DataSectionEncoding_LZB = 1, -} RDI_DataSectionEncodingEnum; - -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_ymm0 = 49, -RDI_RegCodeX64_ymm1 = 50, -RDI_RegCodeX64_ymm2 = 51, -RDI_RegCodeX64_ymm3 = 52, -RDI_RegCodeX64_ymm4 = 53, -RDI_RegCodeX64_ymm5 = 54, -RDI_RegCodeX64_ymm6 = 55, -RDI_RegCodeX64_ymm7 = 56, -RDI_RegCodeX64_ymm8 = 57, -RDI_RegCodeX64_ymm9 = 58, -RDI_RegCodeX64_ymm10 = 59, -RDI_RegCodeX64_ymm11 = 60, -RDI_RegCodeX64_ymm12 = 61, -RDI_RegCodeX64_ymm13 = 62, -RDI_RegCodeX64_ymm14 = 63, -RDI_RegCodeX64_ymm15 = 64, -RDI_RegCodeX64_mxcsr = 65, -RDI_RegCodeX64_fsbase = 66, -RDI_RegCodeX64_gsbase = 67, -RDI_RegCodeX64_fcw = 68, -RDI_RegCodeX64_fsw = 69, -RDI_RegCodeX64_ftw = 70, -RDI_RegCodeX64_fop = 71, -RDI_RegCodeX64_fcs = 72, -RDI_RegCodeX64_fds = 73, -RDI_RegCodeX64_fip = 74, -RDI_RegCodeX64_fdp = 75, -RDI_RegCodeX64_mxcsr_mask = 76, -} 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_COUNT = 3, -} 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_Char8 = 0x0003, -RDI_TypeKind_Char16 = 0x0004, -RDI_TypeKind_Char32 = 0x0005, -RDI_TypeKind_UChar8 = 0x0006, -RDI_TypeKind_UChar16 = 0x0007, -RDI_TypeKind_UChar32 = 0x0008, -RDI_TypeKind_U8 = 0x0009, -RDI_TypeKind_U16 = 0x000A, -RDI_TypeKind_U32 = 0x000B, -RDI_TypeKind_U64 = 0x000C, -RDI_TypeKind_U128 = 0x000D, -RDI_TypeKind_U256 = 0x000E, -RDI_TypeKind_U512 = 0x000F, -RDI_TypeKind_S8 = 0x0010, -RDI_TypeKind_S16 = 0x0011, -RDI_TypeKind_S32 = 0x0012, -RDI_TypeKind_S64 = 0x0013, -RDI_TypeKind_S128 = 0x0014, -RDI_TypeKind_S256 = 0x0015, -RDI_TypeKind_S512 = 0x0016, -RDI_TypeKind_Bool = 0x0017, -RDI_TypeKind_F16 = 0x0018, -RDI_TypeKind_F32 = 0x0019, -RDI_TypeKind_F32PP = 0x001A, -RDI_TypeKind_F48 = 0x001B, -RDI_TypeKind_F64 = 0x001C, -RDI_TypeKind_F80 = 0x001D, -RDI_TypeKind_F128 = 0x001E, -RDI_TypeKind_ComplexF32 = 0x001F, -RDI_TypeKind_ComplexF64 = 0x0020, -RDI_TypeKind_ComplexF80 = 0x0021, -RDI_TypeKind_ComplexF128 = 0x0022, -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_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_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_Abs = 16, -RDI_EvalOp_Neg = 17, -RDI_EvalOp_Add = 18, -RDI_EvalOp_Sub = 19, -RDI_EvalOp_Mul = 20, -RDI_EvalOp_Div = 21, -RDI_EvalOp_Mod = 22, -RDI_EvalOp_LShift = 23, -RDI_EvalOp_RShift = 24, -RDI_EvalOp_BitAnd = 25, -RDI_EvalOp_BitOr = 26, -RDI_EvalOp_BitXor = 27, -RDI_EvalOp_BitNot = 28, -RDI_EvalOp_LogAnd = 29, -RDI_EvalOp_LogOr = 30, -RDI_EvalOp_LogNot = 31, -RDI_EvalOp_EqEq = 32, -RDI_EvalOp_NtEq = 33, -RDI_EvalOp_LsEq = 34, -RDI_EvalOp_GrEq = 35, -RDI_EvalOp_Less = 36, -RDI_EvalOp_Grtr = 37, -RDI_EvalOp_Trunc = 38, -RDI_EvalOp_TruncSigned = 39, -RDI_EvalOp_Convert = 40, -RDI_EvalOp_Pick = 41, -RDI_EvalOp_Pop = 42, -RDI_EvalOp_Insert = 43, -RDI_EvalOp_COUNT = 44, -} 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_Procedures = 3, -RDI_NameMapKind_Types = 4, -RDI_NameMapKind_LinkNameProcedures = 5, -RDI_NameMapKind_NormalSourcePaths = 6, -RDI_NameMapKind_COUNT = 7, -} RDI_NameMapKindEnum; - -#define RDI_DataSectionTag_XList \ -X(NULL)\ -X(TopLevelInfo)\ -X(StringData)\ -X(StringTable)\ -X(IndexRuns)\ -X(BinarySections)\ -X(FilePathNodes)\ -X(SourceFiles)\ -X(Units)\ -X(UnitVmap)\ -X(TypeNodes)\ -X(UDTs)\ -X(Members)\ -X(EnumMembers)\ -X(GlobalVariables)\ -X(GlobalVmap)\ -X(ThreadVariables)\ -X(Procedures)\ -X(Scopes)\ -X(ScopeVoffData)\ -X(ScopeVmap)\ -X(Locals)\ -X(LocationBlocks)\ -X(LocationData)\ -X(NameMaps)\ -X(PRIMARY_COUNT)\ -X(SECONDARY)\ -X(LineInfoVoffs)\ -X(LineInfoData)\ -X(LineInfoColumns)\ -X(LineMapNumbers)\ -X(LineMapRanges)\ -X(LineMapVoffs)\ -X(NameMapBuckets)\ -X(NameMapNodes)\ - -#define RDI_DataSectionEncoding_XList \ -X(Unpacked)\ -X(LZB)\ - -#define RDI_Arch_XList \ -X(NULL)\ -X(X86)\ -X(X64)\ - -#define RDI_BinarySectionFlags_XList \ -X(NULL)\ -X(X86)\ -X(X64)\ - -#define RDI_Language_XList \ -X(NULL)\ -X(C)\ -X(CPlusPlus)\ -X(COUNT)\ - -#define RDI_TypeKind_XList \ -X(NULL)\ -X(Void)\ -X(Handle)\ -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)\ - -#define RDI_TypeModifierFlags_XList \ -X(Const)\ -X(Volatile)\ - -#define RDI_UDTFlag_XList \ -X(EnumMembers)\ - -#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_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_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(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(COUNT)\ - -#define RDI_EvalTypeGroup_XList \ -X(Other)\ -X(U)\ -X(S)\ -X(F32)\ -X(F64)\ -X(COUNT)\ - -#define RDI_EvalConversionKind_XList \ -X(Noop)\ -X(Legal)\ -X(OtherToOther)\ -X(ToOther)\ -X(FromOther)\ -X(COUNT)\ - -#define RDI_NameMapKind_XList \ -X(NULL)\ -X(GlobalVariables)\ -X(ThreadVariables)\ -X(Procedures)\ -X(Types)\ -X(LinkNameProcedures)\ -X(NormalSourcePaths)\ -X(COUNT)\ - -#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) ((decodeN) | ((popN) << 4) | ((pushN) << 6)) -#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) ((ctrlbits) & 0xf) -#define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0x3) -#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 6) & 0x3) -#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_DataSection RDI_DataSection; -struct RDI_DataSection -{ -RDI_DataSectionTag tag; -RDI_DataSectionEncoding encoding; -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; -}; - -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 line_map_count; -RDI_U32 line_map_nums_data_idx; -RDI_U32 line_map_range_data_idx; -RDI_U32 line_map_voff_data_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_info_voffs_data_idx; -RDI_U32 line_info_data_idx; -RDI_U32 line_info_col_data_idx; -RDI_U32 line_info_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_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_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; -}; - -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; -}; - -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_NameMapKind kind; -RDI_U32 bucket_data_idx; -RDI_U32 node_data_idx; -}; - -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; -}; - -RDI_PROC RDI_U64 rdi_hash(RDI_U8 *ptr, RDI_U64 size); -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_U8 rdi_eval_op_ctrlbits_table[45]; - -#endif // RDI_FORMAT_H diff --git a/src/rdi_format/rdi_format.mdesk b/src/rdi_format/rdi_format.mdesk index ed078778..89f284be 100644 --- a/src/rdi_format/rdi_format.mdesk +++ b/src/rdi_format/rdi_format.mdesk @@ -5,7 +5,7 @@ //~ rjf: Generated File Format @option library -@gen_folder "lib" +@gen_folder "lib_rdi_format" @h_name "rdi_format.h" @c_name "rdi_format.c" diff --git a/src/rdi_format_local/rdi_format_local.c b/src/rdi_format/rdi_format_local.c similarity index 100% rename from src/rdi_format_local/rdi_format_local.c rename to src/rdi_format/rdi_format_local.c diff --git a/src/rdi_format_local/rdi_format_local.h b/src/rdi_format/rdi_format_local.h similarity index 100% rename from src/rdi_format_local/rdi_format_local.h rename to src/rdi_format/rdi_format_local.h