float codeview, msf, pdb layers up as regular codebase layers, and out of converter-specific code; clangify some builds

This commit is contained in:
Ryan Fleury
2024-02-13 09:51:50 -08:00
parent 017116aee9
commit 7defce94c7
25 changed files with 359 additions and 428 deletions
@@ -4,7 +4,7 @@
//////////////////////////////// ////////////////////////////////
//~ CodeView Common Functions //~ CodeView Common Functions
static CV_NumericParsed internal CV_NumericParsed
cv_numeric_from_data_range(U8 *first, U8 *opl){ cv_numeric_from_data_range(U8 *first, U8 *opl){
CV_NumericParsed result = {0}; CV_NumericParsed result = {0};
if (first + 2 <= opl){ if (first + 2 <= opl){
@@ -52,7 +52,7 @@ cv_numeric_from_data_range(U8 *first, U8 *opl){
return(result); return(result);
} }
static B32 internal B32
cv_numeric_fits_in_u64(CV_NumericParsed *num){ cv_numeric_fits_in_u64(CV_NumericParsed *num){
B32 result = 0; B32 result = 0;
switch (num->kind){ switch (num->kind){
@@ -66,7 +66,7 @@ cv_numeric_fits_in_u64(CV_NumericParsed *num){
return(result); return(result);
} }
static B32 internal B32
cv_numeric_fits_in_s64(CV_NumericParsed *num){ cv_numeric_fits_in_s64(CV_NumericParsed *num){
B32 result = 0; B32 result = 0;
switch (num->kind){ switch (num->kind){
@@ -81,7 +81,7 @@ cv_numeric_fits_in_s64(CV_NumericParsed *num){
return(result); return(result);
} }
static B32 internal B32
cv_numeric_fits_in_f64(CV_NumericParsed *num){ cv_numeric_fits_in_f64(CV_NumericParsed *num){
B32 result = 0; B32 result = 0;
switch (num->kind){ switch (num->kind){
@@ -94,7 +94,7 @@ cv_numeric_fits_in_f64(CV_NumericParsed *num){
return(result); return(result);
} }
static U64 internal U64
cv_u64_from_numeric(CV_NumericParsed *num){ cv_u64_from_numeric(CV_NumericParsed *num){
U64 result = 0; U64 result = 0;
switch (num->kind){ switch (num->kind){
@@ -116,7 +116,7 @@ cv_u64_from_numeric(CV_NumericParsed *num){
return(result); return(result);
} }
static S64 internal S64
cv_s64_from_numeric(CV_NumericParsed *num){ cv_s64_from_numeric(CV_NumericParsed *num){
S64 result = 0; S64 result = 0;
switch (num->kind){ switch (num->kind){
@@ -143,7 +143,7 @@ cv_s64_from_numeric(CV_NumericParsed *num){
return(result); return(result);
} }
static F64 internal F64
cv_f64_from_numeric(CV_NumericParsed *num){ cv_f64_from_numeric(CV_NumericParsed *num){
F64 result = 0; F64 result = 0;
switch (num->kind){ switch (num->kind){
@@ -164,54 +164,9 @@ cv_f64_from_numeric(CV_NumericParsed *num){
//////////////////////////////// ////////////////////////////////
//~ CodeView Sym Parser Functions //~ CodeView Sym Parser Functions
static CV_SymParsed* //- the first pass parser
cv_sym_from_data(Arena *arena, String8 sym_data, U64 sym_align){
Assert(1 <= sym_align && IsPow2OrZero(sym_align));
ProfBegin("cv_sym_from_data");
Temp scratch = scratch_begin(&arena, 1); internal CV_RecRangeStream*
// gather up symbols
CV_RecRangeStream *stream = cv_rec_range_stream_from_data(scratch.arena, sym_data, sym_align);
// convert to result
CV_SymParsed *result = push_array(arena, CV_SymParsed, 1);
result->data = sym_data;
result->sym_align = sym_align;
result->sym_ranges = cv_rec_range_array_from_stream(arena, stream);
cv_sym_top_level_info_from_syms(arena, sym_data, &result->sym_ranges, &result->info);
scratch_end(scratch);
ProfEnd();
return(result);
}
static CV_LeafParsed*
cv_leaf_from_data(Arena *arena, String8 leaf_data, CV_TypeId itype_first){
ProfBegin("cv_leaf_from_data");
Temp scratch = scratch_begin(&arena, 1);
// gather up symbols
CV_RecRangeStream *stream = cv_rec_range_stream_from_data(scratch.arena, leaf_data, 1);
// convert to result
CV_LeafParsed *result = push_array(arena, CV_LeafParsed, 1);
result->data = leaf_data;
result->itype_first = itype_first;
result->itype_opl = itype_first + stream->total_count;
result->leaf_ranges = cv_rec_range_array_from_stream(arena, stream);
scratch_end(scratch);
ProfEnd();
return(result);
}
static CV_RecRangeStream*
cv_rec_range_stream_from_data(Arena *arena, String8 sym_data, U64 sym_align){ cv_rec_range_stream_from_data(Arena *arena, String8 sym_data, U64 sym_align){
Assert(1 <= sym_align && IsPow2OrZero(sym_align)); Assert(1 <= sym_align && IsPow2OrZero(sym_align));
@@ -248,7 +203,33 @@ cv_rec_range_stream_from_data(Arena *arena, String8 sym_data, U64 sym_align){
return(result); return(result);
} }
static void //- sym
internal CV_SymParsed*
cv_sym_from_data(Arena *arena, String8 sym_data, U64 sym_align){
Assert(1 <= sym_align && IsPow2OrZero(sym_align));
ProfBegin("cv_sym_from_data");
Temp scratch = scratch_begin(&arena, 1);
// gather up symbols
CV_RecRangeStream *stream = cv_rec_range_stream_from_data(scratch.arena, sym_data, sym_align);
// convert to result
CV_SymParsed *result = push_array(arena, CV_SymParsed, 1);
result->data = sym_data;
result->sym_align = sym_align;
result->sym_ranges = cv_rec_range_array_from_stream(arena, stream);
cv_sym_top_level_info_from_syms(arena, sym_data, &result->sym_ranges, &result->info);
scratch_end(scratch);
ProfEnd();
return(result);
}
internal void
cv_sym_top_level_info_from_syms(Arena *arena, String8 sym_data, cv_sym_top_level_info_from_syms(Arena *arena, String8 sym_data,
CV_RecRangeArray *ranges, CV_RecRangeArray *ranges,
CV_SymTopLevelInfo *info_out){ CV_SymTopLevelInfo *info_out){
@@ -313,17 +294,41 @@ cv_sym_top_level_info_from_syms(Arena *arena, String8 sym_data,
} }
} }
//- leaf
internal CV_LeafParsed*
cv_leaf_from_data(Arena *arena, String8 leaf_data, CV_TypeId itype_first){
ProfBegin("cv_leaf_from_data");
Temp scratch = scratch_begin(&arena, 1);
// gather up symbols
CV_RecRangeStream *stream = cv_rec_range_stream_from_data(scratch.arena, leaf_data, 1);
// convert to result
CV_LeafParsed *result = push_array(arena, CV_LeafParsed, 1);
result->data = leaf_data;
result->itype_first = itype_first;
result->itype_opl = itype_first + stream->total_count;
result->leaf_ranges = cv_rec_range_array_from_stream(arena, stream);
scratch_end(scratch);
ProfEnd();
return(result);
}
//- range streams //- range streams
static CV_RecRangeChunk* internal CV_RecRangeChunk*
cv_rec_range_stream_push_chunk(Arena *arena, CV_RecRangeStream *stream){ cv_rec_range_stream_push_chunk(Arena *arena, CV_RecRangeStream *stream){
CV_RecRangeChunk *result = push_array_no_zero(arena, CV_RecRangeChunk, 1); CV_RecRangeChunk *result = push_array_no_zero(arena, CV_RecRangeChunk, 1);
SLLQueuePush(stream->first_chunk, stream->last_chunk, result); SLLQueuePush(stream->first_chunk, stream->last_chunk, result);
return(result); return(result);
} }
static CV_RecRangeArray internal CV_RecRangeArray
cv_rec_range_array_from_stream(Arena *arena, CV_RecRangeStream *stream){ cv_rec_range_array_from_stream(Arena *arena, CV_RecRangeStream *stream){
U64 total_count = stream->total_count; U64 total_count = stream->total_count;
CV_RecRange *ranges = push_array_no_zero(arena, CV_RecRange, total_count); CV_RecRange *ranges = push_array_no_zero(arena, CV_RecRange, total_count);
@@ -345,9 +350,8 @@ cv_rec_range_array_from_stream(Arena *arena, CV_RecRangeStream *stream){
//////////////////////////////// ////////////////////////////////
//~ CodeView C13 Parser Functions //~ CodeView C13 Parser Functions
static CV_C13Parsed* internal CV_C13Parsed*
cv_c13_from_data(Arena *arena, String8 c13_data, cv_c13_from_data(Arena *arena, String8 c13_data, PDB_Strtbl *strtbl, PDB_CoffSectionArray *sections){
PDB_Strtbl *strtbl, PDB_CoffSectionArray *sections){
ProfBegin("cv_c13_from_data"); ProfBegin("cv_c13_from_data");
// gather c13 data // gather c13 data
@@ -1,8 +1,8 @@
// Copyright (c) 2024 Epic Games Tools // Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef RADDBGI_CODEVIEW_H #ifndef CODEVIEW_H
#define RADDBGI_CODEVIEW_H #define CODEVIEW_H
#pragma pack(push, 1) #pragma pack(push, 1)
@@ -3015,46 +3015,44 @@ typedef struct CV_TypeIdArray{
//////////////////////////////// ////////////////////////////////
//~ CodeView Common Functions //~ CodeView Common Functions
static CV_NumericParsed cv_numeric_from_data_range(U8 *first, U8 *opl); internal CV_NumericParsed cv_numeric_from_data_range(U8 *first, U8 *opl);
static B32 cv_numeric_fits_in_u64(CV_NumericParsed *num); internal B32 cv_numeric_fits_in_u64(CV_NumericParsed *num);
static B32 cv_numeric_fits_in_s64(CV_NumericParsed *num); internal B32 cv_numeric_fits_in_s64(CV_NumericParsed *num);
static B32 cv_numeric_fits_in_f64(CV_NumericParsed *num); internal B32 cv_numeric_fits_in_f64(CV_NumericParsed *num);
static U64 cv_u64_from_numeric(CV_NumericParsed *num); internal U64 cv_u64_from_numeric(CV_NumericParsed *num);
static S64 cv_s64_from_numeric(CV_NumericParsed *num); internal S64 cv_s64_from_numeric(CV_NumericParsed *num);
static F64 cv_f64_from_numeric(CV_NumericParsed *num); internal F64 cv_f64_from_numeric(CV_NumericParsed *num);
//////////////////////////////// ////////////////////////////////
//~ CodeView Sym/Leaf Parser Functions //~ CodeView Sym/Leaf Parser Functions
//- the first pass parser //- the first pass parser
static CV_RecRangeStream* cv_rec_range_stream_from_data(Arena *arena, String8 data, U64 align); internal CV_RecRangeStream* cv_rec_range_stream_from_data(Arena *arena, String8 data, U64 align);
//- sym //- sym
static CV_SymParsed* cv_sym_from_data(Arena *arena, String8 sym_data, U64 sym_align); internal CV_SymParsed* cv_sym_from_data(Arena *arena, String8 sym_data, U64 sym_align);
static void cv_sym_top_level_info_from_syms(Arena *arena, String8 sym_data, internal void cv_sym_top_level_info_from_syms(Arena *arena, String8 sym_data,
CV_RecRangeArray *ranges, CV_RecRangeArray *ranges,
CV_SymTopLevelInfo *info_out); CV_SymTopLevelInfo *info_out);
//- leaf //- leaf
static CV_LeafParsed* cv_leaf_from_data(Arena *arena, String8 leaf_data, CV_TypeId first); internal CV_LeafParsed* cv_leaf_from_data(Arena *arena, String8 leaf_data, CV_TypeId first);
//- range streams //- range streams
static CV_RecRangeChunk* cv_rec_range_stream_push_chunk(Arena *arena, internal CV_RecRangeChunk* cv_rec_range_stream_push_chunk(Arena *arena,
CV_RecRangeStream *stream); CV_RecRangeStream *stream);
// TODO(allen): check why this isn't a pointer return - // TODO(allen): check why this isn't a pointer return -
// leave a note if there's a good reason, otherwise switch to pointer return // leave a note if there's a good reason, otherwise switch to pointer return
static CV_RecRangeArray cv_rec_range_array_from_stream(Arena *arena, internal CV_RecRangeArray cv_rec_range_array_from_stream(Arena *arena, CV_RecRangeStream *stream);
CV_RecRangeStream *stream);
//////////////////////////////// ////////////////////////////////
//~ CodeView C13 Parser Functions //~ CodeView C13 Parser Functions
typedef struct PDB_Strtbl PDB_Strtbl; typedef struct PDB_Strtbl PDB_Strtbl;
typedef struct PDB_CoffSectionArray PDB_CoffSectionArray; typedef struct PDB_CoffSectionArray PDB_CoffSectionArray;
static CV_C13Parsed* cv_c13_from_data(Arena *arena, String8 c13_data, internal CV_C13Parsed* cv_c13_from_data(Arena *arena, String8 c13_data, struct PDB_Strtbl *strtbl, struct PDB_CoffSectionArray *sections);
struct PDB_Strtbl *strtbl, struct PDB_CoffSectionArray *sections);
#endif //RADDBGI_CODEVIEW_H #endif // CODEVIEW_H
@@ -4,7 +4,7 @@
//////////////////////////////// ////////////////////////////////
//~ CodeView Common Stringize Functions //~ CodeView Common Stringize Functions
static void internal void
cv_stringize_numeric(Arena *arena, String8List *out, CV_NumericParsed *num){ cv_stringize_numeric(Arena *arena, String8List *out, CV_NumericParsed *num){
String8 numeric_kind_str = cv_string_from_numeric_kind(num->kind); String8 numeric_kind_str = cv_string_from_numeric_kind(num->kind);
str8_list_pushf(arena, out, "(%.*s)", str8_varg(numeric_kind_str)); str8_list_pushf(arena, out, "(%.*s)", str8_varg(numeric_kind_str));
@@ -23,17 +23,17 @@ cv_stringize_numeric(Arena *arena, String8List *out, CV_NumericParsed *num){
} }
} }
static void internal void
cv_stringize_lvar_addr_range(Arena *arena, String8List *out, CV_LvarAddrRange *range){ cv_stringize_lvar_addr_range(Arena *arena, String8List *out, CV_LvarAddrRange *range){
str8_list_pushf(arena, out, "{off=%x, sec=%u, len=%u}", range->off, range->sec, range->len); str8_list_pushf(arena, out, "{off=%x, sec=%u, len=%u}", range->off, range->sec, range->len);
} }
static void internal void
cv_stringize_lvar_addr_gap(Arena *arena, String8List *out, CV_LvarAddrGap *gap){ cv_stringize_lvar_addr_gap(Arena *arena, String8List *out, CV_LvarAddrGap *gap){
str8_list_pushf(arena, out, "{off=%x, len=%u}", gap->off, gap->len); str8_list_pushf(arena, out, "{off=%x, len=%u}", gap->off, gap->len);
} }
static void internal void
cv_stringize_lvar_addr_gap_list(Arena *arena, String8List *out, void *first, void *opl){ cv_stringize_lvar_addr_gap_list(Arena *arena, String8List *out, void *first, void *opl){
U64 gap_count = ((U8*)first - (U8*)opl)/sizeof(CV_LvarAddrGap); U64 gap_count = ((U8*)first - (U8*)opl)/sizeof(CV_LvarAddrGap);
if (gap_count > 0){ if (gap_count > 0){
@@ -48,7 +48,7 @@ cv_stringize_lvar_addr_gap_list(Arena *arena, String8List *out, void *first, voi
} }
} }
static String8 internal String8
cv_string_from_sym_kind(CV_SymKind kind){ cv_string_from_sym_kind(CV_SymKind kind){
String8 result = str8_lit("UNRECOGNIZED_SYM_KIND"); String8 result = str8_lit("UNRECOGNIZED_SYM_KIND");
switch (kind){ switch (kind){
@@ -59,7 +59,7 @@ cv_string_from_sym_kind(CV_SymKind kind){
return(result); return(result);
} }
static String8 internal String8
cv_string_from_basic_type(CV_BasicType basic_type){ cv_string_from_basic_type(CV_BasicType basic_type){
String8 result = str8_lit("UNRECOGNIZED_BASIC_TYPE"); String8 result = str8_lit("UNRECOGNIZED_BASIC_TYPE");
switch (basic_type){ switch (basic_type){
@@ -70,7 +70,7 @@ cv_string_from_basic_type(CV_BasicType basic_type){
return(result); return(result);
} }
static String8 internal String8
cv_string_from_leaf_kind(CV_LeafKind kind){ cv_string_from_leaf_kind(CV_LeafKind kind){
String8 result = str8_lit("UNRECOGNIZED_LEAF_KIND"); String8 result = str8_lit("UNRECOGNIZED_LEAF_KIND");
switch (kind){ switch (kind){
@@ -85,7 +85,7 @@ cv_string_from_leaf_kind(CV_LeafKind kind){
return(result); return(result);
} }
static String8 internal String8
cv_string_from_numeric_kind(CV_NumericKind kind){ cv_string_from_numeric_kind(CV_NumericKind kind){
String8 result = str8_lit("UNRECOGNIZED_NUMERIC_KIND"); String8 result = str8_lit("UNRECOGNIZED_NUMERIC_KIND");
switch (kind){ switch (kind){
@@ -97,7 +97,7 @@ cv_string_from_numeric_kind(CV_NumericKind kind){
return(result); return(result);
} }
static String8 internal String8
cv_string_from_c13_sub_section_kind(CV_C13_SubSectionKind kind){ cv_string_from_c13_sub_section_kind(CV_C13_SubSectionKind kind){
String8 result = str8_lit("UNRECOGNIZED_C13_SUB_SECTION_KIND"); String8 result = str8_lit("UNRECOGNIZED_C13_SUB_SECTION_KIND");
switch (kind){ switch (kind){
@@ -109,7 +109,7 @@ cv_string_from_c13_sub_section_kind(CV_C13_SubSectionKind kind){
return(result); return(result);
} }
static String8 internal String8
cv_string_from_machine(CV_Arch arch){ cv_string_from_machine(CV_Arch arch){
String8 result = {0}; String8 result = {0};
switch (arch){ switch (arch){
@@ -120,7 +120,7 @@ cv_string_from_machine(CV_Arch arch){
return(result); return(result);
} }
static String8 internal String8
cv_string_from_reg(CV_Arch arch, CV_Reg reg){ cv_string_from_reg(CV_Arch arch, CV_Reg reg){
String8 result = {0}; String8 result = {0};
switch (arch){ switch (arch){
@@ -147,7 +147,7 @@ cv_string_from_reg(CV_Arch arch, CV_Reg reg){
return(result); return(result);
} }
static String8 internal String8
cv_string_from_pointer_kind(CV_PointerKind ptr_kind){ cv_string_from_pointer_kind(CV_PointerKind ptr_kind){
String8 result = {0}; String8 result = {0};
switch (ptr_kind){ switch (ptr_kind){
@@ -169,7 +169,7 @@ cv_string_from_pointer_kind(CV_PointerKind ptr_kind){
return(result); return(result);
} }
static String8 internal String8
cv_string_from_pointer_mode(CV_PointerMode ptr_mode){ cv_string_from_pointer_mode(CV_PointerMode ptr_mode){
String8 result = {0}; String8 result = {0};
switch (ptr_mode){ switch (ptr_mode){
@@ -183,7 +183,7 @@ cv_string_from_pointer_mode(CV_PointerMode ptr_mode){
return(result); return(result);
} }
static String8 internal String8
cv_string_from_hfa_kind(CV_HFAKind hfa_kind){ cv_string_from_hfa_kind(CV_HFAKind hfa_kind){
String8 result = {0}; String8 result = {0};
switch (hfa_kind){ switch (hfa_kind){
@@ -196,7 +196,7 @@ cv_string_from_hfa_kind(CV_HFAKind hfa_kind){
return(result); return(result);
} }
static String8 internal String8
cv_string_from_mo_com_udt_kind(CV_MoComUDTKind mo_com_udt_kind){ cv_string_from_mo_com_udt_kind(CV_MoComUDTKind mo_com_udt_kind){
String8 result = {0}; String8 result = {0};
switch (mo_com_udt_kind){ switch (mo_com_udt_kind){
@@ -212,11 +212,11 @@ cv_string_from_mo_com_udt_kind(CV_MoComUDTKind mo_com_udt_kind){
//////////////////////////////// ////////////////////////////////
//~ CodeView Flags Stringize Functions //~ CodeView Flags Stringize Functions
static char cv_stringize_spaces[] = " "; global char cv_stringize_spaces[] = " ";
#define SPACES cv_stringize_spaces #define SPACES cv_stringize_spaces
static void internal void
cv_stringize_modifier_flags(Arena *arena, String8List *out, cv_stringize_modifier_flags(Arena *arena, String8List *out,
U32 indent, CV_ModifierFlags flags){ U32 indent, CV_ModifierFlags flags){
if (flags & CV_ModifierFlag_Const){ if (flags & CV_ModifierFlag_Const){
@@ -230,7 +230,7 @@ cv_stringize_modifier_flags(Arena *arena, String8List *out,
} }
} }
static void internal void
cv_stringize_type_props(Arena *arena, String8List *out, cv_stringize_type_props(Arena *arena, String8List *out,
U32 indent, CV_TypeProps props){ U32 indent, CV_TypeProps props){
if (props & CV_TypeProp_Packed){ if (props & CV_TypeProp_Packed){
@@ -285,7 +285,7 @@ cv_stringize_type_props(Arena *arena, String8List *out,
} }
} }
static void internal void
cv_stringize_pointer_attribs(Arena *arena, String8List *out, cv_stringize_pointer_attribs(Arena *arena, String8List *out,
U32 indent, CV_PointerAttribs attribs){ U32 indent, CV_PointerAttribs attribs){
if (attribs & CV_PointerAttrib_IsFlat){ if (attribs & CV_PointerAttrib_IsFlat){
@@ -332,7 +332,7 @@ cv_stringize_pointer_attribs(Arena *arena, String8List *out,
indent, SPACES, size); indent, SPACES, size);
} }
static void internal void
cv_stringize_local_flags(Arena *arena, String8List *out, cv_stringize_local_flags(Arena *arena, String8List *out,
U32 indent, CV_LocalFlags flags){ U32 indent, CV_LocalFlags flags){
if (flags & CV_LocalFlag_Param){ if (flags & CV_LocalFlag_Param){
@@ -376,7 +376,7 @@ cv_stringize_local_flags(Arena *arena, String8List *out,
//////////////////////////////// ////////////////////////////////
//~ CodeView Sym Stringize Functions //~ CodeView Sym Stringize Functions
static void internal void
cv_stringize_sym_parsed(Arena *arena, String8List *out, CV_SymParsed *sym){ cv_stringize_sym_parsed(Arena *arena, String8List *out, CV_SymParsed *sym){
CV_StringizeSymParams params = {0}; CV_StringizeSymParams params = {0};
params.arch = sym->info.arch; params.arch = sym->info.arch;
@@ -384,7 +384,7 @@ cv_stringize_sym_parsed(Arena *arena, String8List *out, CV_SymParsed *sym){
cv_stringize_sym_array(arena, out, &sym->sym_ranges, sym->data, &params); cv_stringize_sym_array(arena, out, &sym->sym_ranges, sym->data, &params);
} }
static void internal void
cv_stringize_sym_range(Arena *arena, String8List *out, cv_stringize_sym_range(Arena *arena, String8List *out,
CV_RecRange *range, String8 data, CV_RecRange *range, String8 data,
CV_StringizeSymParams *p){ CV_StringizeSymParams *p){
@@ -1381,7 +1381,7 @@ cv_stringize_sym_range(Arena *arena, String8List *out,
} }
} }
static void internal void
cv_stringize_sym_array(Arena *arena, String8List *out, cv_stringize_sym_array(Arena *arena, String8List *out,
CV_RecRangeArray *ranges, String8 data, CV_RecRangeArray *ranges, String8 data,
CV_StringizeSymParams *p){ CV_StringizeSymParams *p){
@@ -1396,7 +1396,7 @@ cv_stringize_sym_array(Arena *arena, String8List *out,
//////////////////////////////// ////////////////////////////////
//~ CodeView Leaf Stringize Functions //~ CodeView Leaf Stringize Functions
static void internal void
cv_stringize_leaf_parsed(Arena *arena, String8List *out, CV_LeafParsed *leaf){ cv_stringize_leaf_parsed(Arena *arena, String8List *out, CV_LeafParsed *leaf){
CV_StringizeLeafParams params = {0}; CV_StringizeLeafParams params = {0};
@@ -1404,7 +1404,7 @@ cv_stringize_leaf_parsed(Arena *arena, String8List *out, CV_LeafParsed *leaf){
leaf->data, &params); leaf->data, &params);
} }
static void internal void
cv_stringize_leaf_range(Arena *arena, String8List *out, cv_stringize_leaf_range(Arena *arena, String8List *out,
CV_RecRange *range, CV_TypeId itype, String8 data, CV_RecRange *range, CV_TypeId itype, String8 data,
CV_StringizeLeafParams *p){ CV_StringizeLeafParams *p){
@@ -2312,7 +2312,7 @@ cv_stringize_leaf_range(Arena *arena, String8List *out,
} }
} }
static void internal void
cv_stringize_leaf_array(Arena *arena, String8List *out, cv_stringize_leaf_array(Arena *arena, String8List *out,
CV_RecRangeArray *ranges, CV_TypeId itype_first, String8 data, CV_RecRangeArray *ranges, CV_TypeId itype_first, String8 data,
CV_StringizeLeafParams *p){ CV_StringizeLeafParams *p){
@@ -2328,7 +2328,7 @@ cv_stringize_leaf_array(Arena *arena, String8List *out,
//////////////////////////////// ////////////////////////////////
//~ CodeView C13 Stringize Functions //~ CodeView C13 Stringize Functions
static void internal void
cv_stringize_c13_parsed(Arena *arena, String8List *out, CV_C13Parsed *c13){ cv_stringize_c13_parsed(Arena *arena, String8List *out, CV_C13Parsed *c13){
for(CV_C13SubSectionNode *node = c13->first_sub_section; for(CV_C13SubSectionNode *node = c13->first_sub_section;
node != 0; node != 0;
+86
View File
@@ -0,0 +1,86 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef CODEVIEW_STRINGIZE_H
#define CODEVIEW_STRINGIZE_H
////////////////////////////////
//~ CodeView Stringize Helper Types
typedef struct CV_StringizeSymParams{
CV_Arch arch;
} CV_StringizeSymParams;
typedef struct CV_StringizeLeafParams{
U32 dummy;
} CV_StringizeLeafParams;
////////////////////////////////
//~ CodeView Common Stringize Functions
internal void cv_stringize_numeric(Arena *arena, String8List *out, CV_NumericParsed *num);
internal void cv_stringize_lvar_addr_range(Arena *arena, String8List *out,
CV_LvarAddrRange *range);
internal void cv_stringize_lvar_addr_gap(Arena *arena, String8List *out, CV_LvarAddrGap *gap);
internal void cv_stringize_lvar_addr_gap_list(Arena *arena, String8List *out,
void *first, void *opl);
internal String8 cv_string_from_sym_kind(CV_SymKind kind);
internal String8 cv_string_from_basic_type(CV_BasicType basic_type);
internal String8 cv_string_from_leaf_kind(CV_LeafKind kind);
internal String8 cv_string_from_numeric_kind(CV_NumericKind kind);
internal String8 cv_string_from_c13_sub_section_kind(CV_C13_SubSectionKind kind);
internal String8 cv_string_from_machine(CV_Arch arch);
internal String8 cv_string_from_reg(CV_Arch arch, CV_Reg reg);
internal String8 cv_string_from_pointer_kind(CV_PointerKind ptr_kind);
internal String8 cv_string_from_pointer_mode(CV_PointerMode ptr_mode);
internal String8 cv_string_from_hfa_kind(CV_HFAKind hfa_kind);
internal String8 cv_string_from_mo_com_udt_kind(CV_MoComUDTKind mo_com_udt_kind);
////////////////////////////////
//~ CodeView Flags Stringize Functions
internal void cv_stringize_modifier_flags(Arena *arena, String8List *out,
U32 indent, CV_ModifierFlags flags);
internal void cv_stringize_type_props(Arena *arena, String8List *out,
U32 indent, CV_TypeProps props);
internal void cv_stringize_pointer_attribs(Arena *arena, String8List *out,
U32 indent, CV_PointerAttribs attribs);
internal void cv_stringize_local_flags(Arena *arena, String8List *out,
U32 indent, CV_LocalFlags flags);
////////////////////////////////
//~ CodeView Sym Stringize Functions
internal void cv_stringize_sym_parsed(Arena *arena, String8List *out, CV_SymParsed *sym);
internal void cv_stringize_sym_range(Arena *arena, String8List *out,
CV_RecRange *range, String8 data,
CV_StringizeSymParams *p);
internal void cv_stringize_sym_array(Arena *arena, String8List *out,
CV_RecRangeArray *ranges, String8 data,
CV_StringizeSymParams *p);
////////////////////////////////
//~ CodeView Leaf Stringize Functions
internal void cv_stringize_leaf_parsed(Arena *arena, String8List *out, CV_LeafParsed *leaf);
internal void cv_stringize_leaf_range(Arena *arena, String8List *out,
CV_RecRange *range, CV_TypeId itype, String8 data,
CV_StringizeLeafParams *p);
internal void cv_stringize_leaf_array(Arena *arena, String8List *out,
CV_RecRangeArray *ranges, CV_TypeId itype_first,
String8 data,
CV_StringizeLeafParams *p);
////////////////////////////////
//~ CodeView C13 Stringize Functions
internal void cv_stringize_c13_parsed(Arena *arena, String8List *out, CV_C13Parsed *c13);
#endif // CODEVIEW_STRINGIZE_H
+10
View File
@@ -11,6 +11,16 @@ typedef U32 COFF_TimeStamp;
#pragma pack(push,1) #pragma pack(push,1)
typedef struct COFF_Guid COFF_Guid;
struct COFF_Guid
{
U32 data1;
U16 data2;
U16 data3;
U32 data4;
U32 data5;
};
typedef U16 COFF_Flags; typedef U16 COFF_Flags;
enum enum
{ {
+7 -40
View File
@@ -158,57 +158,24 @@ demon_accel_write_regs(DEMON_Entity *thread, void *data){
// get accel data // get accel data
DEMON_AccelThread *accel = demon_accel_from_thread(thread); DEMON_AccelThread *accel = demon_accel_from_thread(thread);
// low level write // write
B32 success = 0; U64 data_size = regs_block_size_from_architecture(thread->arch);
U64 data_size = 0; B32 success = demon_os_write_regs(thread, data);
switch (thread->arch){
case Architecture_x86:
{
data_size = sizeof(REGS_RegBlockX86);
success = demon_os_write_regs_x86(thread, (REGS_RegBlockX86*)data);
}break;
case Architecture_x64:
{
data_size = sizeof(REGS_RegBlockX64);
success = demon_os_write_regs_x64(thread, (REGS_RegBlockX64*)data);
}break;
}
// update cache // update cache
if (success){ if(success)
{
accel->reg_cache_time = demon_time; accel->reg_cache_time = demon_time;
MemoryCopy(&accel->regs, data, data_size); MemoryCopy(&accel->regs, data, data_size);
} }
} }
internal void
demon_accel_low_level_write_regs(DEMON_Entity *thread){
// NOTE(allen): This is a tricky one. It's just a way to enable some internal
// optimizations. Instead of forcing the user to pass in register data
// to write out and copy to the cache, the "user" is other demon code that
// knows what it's doing. So it grabs the cache memory (through a call to
// `demon_accel_read_regs`) modifies it in place and then calls this.
// So we just have to write the cache contents directly out to OS.
// get accel data
DEMON_AccelThread *accel = demon_accel_from_thread(thread);
switch (thread->arch){
case Architecture_x86:
{
demon_os_write_regs_x86(thread, &accel->regs.x86);
}break;
case Architecture_x64:
{
demon_os_write_regs_x64(thread, &accel->regs.x64);
}break;
}
}
//- entity accel free //- entity accel free
internal void internal void
demon_accel_free(DEMON_Entity *entity){ demon_accel_free(DEMON_Entity *entity){
switch (entity->kind){ switch (entity->kind){
default:{}break;
case DEMON_EntityKind_Module: case DEMON_EntityKind_Module:
{ {
if (entity->accel != 0){ if (entity->accel != 0){
-2
View File
@@ -58,8 +58,6 @@ internal U64 demon_accel_tls_root_vaddr_from_thread(DEMON_Entity *threa
internal void* demon_accel_read_regs(DEMON_Entity *thread); internal void* demon_accel_read_regs(DEMON_Entity *thread);
internal void demon_accel_write_regs(DEMON_Entity *thread, void *data); internal void demon_accel_write_regs(DEMON_Entity *thread, void *data);
internal void demon_accel_low_level_write_regs(DEMON_Entity *thread);
//- entity accel free //- entity accel free
internal void demon_accel_free(DEMON_Entity *entity); internal void demon_accel_free(DEMON_Entity *entity);
+1
View File
@@ -134,6 +134,7 @@ demon_ent_new(DEMON_Entity *parent, DEMON_EntityKind kind, U64 id){
internal void internal void
demon_ent_release_single(DEMON_Entity *entity){ demon_ent_release_single(DEMON_Entity *entity){
switch (entity->kind){ switch (entity->kind){
default:{}break;
case DEMON_EntityKind_Process: demon_proc_count -= 1; break; case DEMON_EntityKind_Process: demon_proc_count -= 1; break;
case DEMON_EntityKind_Thread: demon_thread_count -= 1; break; case DEMON_EntityKind_Thread: demon_thread_count -= 1; break;
case DEMON_EntityKind_Module: demon_module_count -= 1; break; case DEMON_EntityKind_Module: demon_module_count -= 1; break;
+16 -9
View File
@@ -460,7 +460,9 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *ctrls){
// set single step bit // set single step bit
if (single_step_thread != 0){ if (single_step_thread != 0){
// TODO(allen): possibly buggy // TODO(allen): possibly buggy
switch (single_step_thread->arch){ switch(single_step_thread->arch)
{
default:{NotImplemented;}break;
case Architecture_x86: case Architecture_x86:
{ {
REGS_RegBlockX86 regs = {0}; REGS_RegBlockX86 regs = {0};
@@ -1287,7 +1289,9 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *ctrls){
// confound us later; so here we're just being sure it's taken out. // confound us later; so here we're just being sure it's taken out.
if (single_step_thread != 0){ if (single_step_thread != 0){
// TODO(allen): possibly buggy // TODO(allen): possibly buggy
switch (single_step_thread->arch){ switch(single_step_thread->arch)
{
default:{NotImplemented;}break;
case Architecture_x86: case Architecture_x86:
{ {
REGS_RegBlockX86 regs = {0}; REGS_RegBlockX86 regs = {0};
@@ -1585,34 +1589,37 @@ demon_os_full_path_from_module(Arena *arena, DEMON_Entity *module){
} }
internal U64 internal U64
demon_os_stack_base_vaddr_from_thread(DEMON_Entity *thread){ demon_os_stack_base_vaddr_from_thread(DEMON_Entity *thread)
{
DEMON_Entity *process = thread->parent; DEMON_Entity *process = thread->parent;
DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); DEMON_W32_Ext *thread_ext = demon_w32_ext(thread);
U64 tlb = thread_ext->thread.thread_local_base; U64 tlb = thread_ext->thread.thread_local_base;
U64 result = 0; U64 result = 0;
switch (thread->arch){ switch (thread->arch)
{
default:{NotImplemented;}break;
case Architecture_x64: case Architecture_x64:
{ {
U64 stack_base_addr = tlb + 0x8; U64 stack_base_addr = tlb + 0x8;
demon_os_read_memory(process, &result, stack_base_addr, 8); demon_os_read_memory(process, &result, stack_base_addr, 8);
}break; }break;
case Architecture_x86: case Architecture_x86:
{ {
U64 stack_base_addr = tlb + 0x4; U64 stack_base_addr = tlb + 0x4;
demon_os_read_memory(process, &result, stack_base_addr, 4); demon_os_read_memory(process, &result, stack_base_addr, 4);
}break; }break;
} }
return(result); return(result);
} }
internal U64 internal U64
demon_os_tls_root_vaddr_from_thread(DEMON_Entity *thread){ demon_os_tls_root_vaddr_from_thread(DEMON_Entity *thread)
{
DEMON_W32_Ext *thread_ext = demon_w32_ext(thread); DEMON_W32_Ext *thread_ext = demon_w32_ext(thread);
U64 result = thread_ext->thread.thread_local_base; U64 result = thread_ext->thread.thread_local_base;
switch (thread->arch){ switch(thread->arch)
{
default:{NotImplemented;}break;
case Architecture_x64: case Architecture_x64:
{ {
result += 88; result += 88;
@@ -4,7 +4,7 @@
//////////////////////////////// ////////////////////////////////
//~ MSF Parser Function //~ MSF Parser Function
static MSF_Parsed* internal MSF_Parsed*
msf_parsed_from_data(Arena *arena, String8 msf_data){ msf_parsed_from_data(Arena *arena, String8 msf_data){
ProfBegin("msf_parsed_from_data"); ProfBegin("msf_parsed_from_data");
@@ -274,7 +274,7 @@ msf_parsed_from_data(Arena *arena, String8 msf_data){
return(result); return(result);
} }
static String8 internal String8
msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn){ msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn){
String8 result = {0}; String8 result = {0};
if (sn < msf->stream_count){ if (sn < msf->stream_count){
@@ -1,8 +1,8 @@
// Copyright (c) 2024 Epic Games Tools // Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef RADDBGI_MSF_H #ifndef MSF_H
#define RADDBGI_MSF_H #define MSF_H
//////////////////////////////// ////////////////////////////////
//~ MSF Format Types //~ MSF Format Types
@@ -54,7 +54,7 @@ typedef struct MSF_Parsed{
//////////////////////////////// ////////////////////////////////
//~ MSF Parser Function //~ MSF Parser Function
static MSF_Parsed* msf_parsed_from_data(Arena *arena, String8 msf_data); internal MSF_Parsed* msf_parsed_from_data(Arena *arena, String8 msf_data);
static String8 msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn); internal String8 msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn);
#endif //RADDBGI_MSF_H #endif // MSF_H
+1 -1
View File
@@ -6,7 +6,7 @@
** stepping, breakpoints, evaluation, cross-module calls. ** stepping, breakpoints, evaluation, cross-module calls.
*/ */
#include "raddbg_markup/raddbg_markup.h" #include "lib_raddbg_markup/raddbg_markup.h"
//////////////////////////////// ////////////////////////////////
// NOTE(allen): System For DLL Testing // NOTE(allen): System For DLL Testing
@@ -4,7 +4,7 @@
//////////////////////////////// ////////////////////////////////
//~ PDB Parser Functions //~ PDB Parser Functions
static PDB_Info* internal PDB_Info*
pdb_info_from_data(Arena *arena, String8 data){ pdb_info_from_data(Arena *arena, String8 data){
ProfBegin("pdb_info_from_data"); ProfBegin("pdb_info_from_data");
@@ -110,7 +110,7 @@ pdb_info_from_data(Arena *arena, String8 data){
return(result); return(result);
} }
static PDB_NamedStreamTable* internal PDB_NamedStreamTable*
pdb_named_stream_table_from_info(Arena *arena, PDB_Info *info){ pdb_named_stream_table_from_info(Arena *arena, PDB_Info *info){
ProfBegin("pdb_named_stream_table_from_info"); ProfBegin("pdb_named_stream_table_from_info");
@@ -156,7 +156,7 @@ pdb_named_stream_table_from_info(Arena *arena, PDB_Info *info){
return(result); return(result);
} }
static PDB_Strtbl* internal PDB_Strtbl*
pdb_strtbl_from_data(Arena *arena, String8 data){ pdb_strtbl_from_data(Arena *arena, String8 data){
ProfBegin("pdb_strtbl_from_data"); ProfBegin("pdb_strtbl_from_data");
@@ -200,7 +200,7 @@ pdb_strtbl_from_data(Arena *arena, String8 data){
return(result); return(result);
} }
static PDB_DbiParsed* internal PDB_DbiParsed*
pdb_dbi_from_data(Arena *arena, String8 data){ pdb_dbi_from_data(Arena *arena, String8 data){
ProfBegin("pdb_dbi_from_data"); ProfBegin("pdb_dbi_from_data");
@@ -225,7 +225,7 @@ pdb_dbi_from_data(Arena *arena, String8 data){
// fill result // fill result
result = push_array(arena, PDB_DbiParsed, 1); result = push_array(arena, PDB_DbiParsed, 1);
result->data = data; result->data = data;
result->arch = header->machine; result->machine_type = header->machine;
result->gsi_sn = header->gsi_sn; result->gsi_sn = header->gsi_sn;
result->psi_sn = header->psi_sn; result->psi_sn = header->psi_sn;
result->sym_sn = header->sym_sn; result->sym_sn = header->sym_sn;
@@ -260,7 +260,7 @@ pdb_dbi_from_data(Arena *arena, String8 data){
return(result); return(result);
} }
static PDB_TpiParsed* internal PDB_TpiParsed*
pdb_tpi_from_data(Arena *arena, String8 data){ pdb_tpi_from_data(Arena *arena, String8 data){
ProfBegin("pdb_tpi_from_data"); ProfBegin("pdb_tpi_from_data");
@@ -302,7 +302,7 @@ pdb_tpi_from_data(Arena *arena, String8 data){
return(result); return(result);
} }
static PDB_TpiHashParsed* internal PDB_TpiHashParsed*
pdb_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, String8 data, String8 aux_data){ pdb_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, String8 data, String8 aux_data){
ProfBegin("pdb_tpi_hash_from_data"); ProfBegin("pdb_tpi_hash_from_data");
@@ -434,7 +434,7 @@ pdb_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, Str
return(result); return(result);
} }
static PDB_GsiParsed* internal PDB_GsiParsed*
pdb_gsi_from_data(Arena *arena, String8 data){ pdb_gsi_from_data(Arena *arena, String8 data){
ProfBegin("pdb_gsi_from_data"); ProfBegin("pdb_gsi_from_data");
@@ -563,7 +563,7 @@ pdb_gsi_from_data(Arena *arena, String8 data){
return(result); return(result);
} }
static PDB_CoffSectionArray* internal PDB_CoffSectionArray*
pdb_coff_section_array_from_data(Arena *arena, String8 data){ pdb_coff_section_array_from_data(Arena *arena, String8 data){
U64 count = data.size/sizeof(COFF_SectionHeader); U64 count = data.size/sizeof(COFF_SectionHeader);
@@ -573,7 +573,7 @@ pdb_coff_section_array_from_data(Arena *arena, String8 data){
return(result); return(result);
} }
static PDB_CompUnitArray* internal PDB_CompUnitArray*
pdb_comp_unit_array_from_data(Arena *arena, String8 data){ pdb_comp_unit_array_from_data(Arena *arena, String8 data){
PDB_CompUnitNode *first = 0; PDB_CompUnitNode *first = 0;
PDB_CompUnitNode *last = 0; PDB_CompUnitNode *last = 0;
@@ -649,7 +649,7 @@ pdb_comp_unit_array_from_data(Arena *arena, String8 data){
return(result); return(result);
} }
static PDB_CompUnitContributionArray* internal PDB_CompUnitContributionArray*
pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 data, pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 data,
PDB_CoffSectionArray *sections){ PDB_CoffSectionArray *sections){
PDB_CompUnitContribution *contributions = 0; PDB_CompUnitContribution *contributions = 0;
@@ -715,7 +715,7 @@ pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 data,
//////////////////////////////// ////////////////////////////////
//~ PDB Definition Functions //~ PDB Definition Functions
static U32 internal U32
pdb_string_hash1(String8 string){ pdb_string_hash1(String8 string){
U32 result = 0; U32 result = 0;
U8 *ptr = string.str; U8 *ptr = string.str;
@@ -733,7 +733,7 @@ pdb_string_hash1(String8 string){
//////////////////////////////// ////////////////////////////////
//~ PDB Dbi Functions //~ PDB Dbi Functions
static String8 internal String8
pdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range){ pdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range){
String8 result = {0}; String8 result = {0};
if (range < PDB_DbiRange_COUNT){ if (range < PDB_DbiRange_COUNT){
@@ -745,7 +745,7 @@ pdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range){
return(result); return(result);
} }
static String8 internal String8
pdb_data_from_unit_range(MSF_Parsed *msf, PDB_CompUnit *unit, PDB_DbiCompUnitRange range){ pdb_data_from_unit_range(MSF_Parsed *msf, PDB_CompUnit *unit, PDB_DbiCompUnitRange range){
String8 result = {0}; String8 result = {0};
if (range < PDB_DbiCompUnitRange_COUNT){ if (range < PDB_DbiCompUnitRange_COUNT){
@@ -765,7 +765,7 @@ pdb_data_from_unit_range(MSF_Parsed *msf, PDB_CompUnit *unit, PDB_DbiCompUnitRan
//////////////////////////////// ////////////////////////////////
//~ PDB Tpi Functions //~ PDB Tpi Functions
static String8 internal String8
pdb_leaf_data_from_tpi(PDB_TpiParsed *tpi){ pdb_leaf_data_from_tpi(PDB_TpiParsed *tpi){
String8 data = tpi->data; String8 data = tpi->data;
U8 *first = data.str + tpi->leaf_first; U8 *first = data.str + tpi->leaf_first;
@@ -774,7 +774,7 @@ pdb_leaf_data_from_tpi(PDB_TpiParsed *tpi){
return(result); return(result);
} }
static CV_TypeIdArray internal CV_TypeIdArray
pdb_tpi_itypes_from_name(Arena *arena, PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *leaf, pdb_tpi_itypes_from_name(Arena *arena, PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *leaf,
String8 name, B32 compare_unique_name, U32 output_cap){ String8 name, B32 compare_unique_name, U32 output_cap){
U32 hash = pdb_string_hash1(name); U32 hash = pdb_string_hash1(name);
@@ -965,7 +965,7 @@ pdb_tpi_itypes_from_name(Arena *arena, PDB_TpiHashParsed *tpi_hash, CV_LeafParse
return(result); return(result);
} }
static CV_TypeId internal CV_TypeId
pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *tpi_leaf, pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *tpi_leaf,
String8 name, B32 compare_unique_name){ String8 name, B32 compare_unique_name){
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
@@ -983,7 +983,7 @@ pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *tpi_le
//////////////////////////////// ////////////////////////////////
//~ PDB Strtbl Functions //~ PDB Strtbl Functions
static String8 internal String8
pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off){ pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off){
U32 strblock_max = strtbl->strblock_max; U32 strblock_max = strtbl->strblock_max;
U32 full_off_raw = strtbl->strblock_min + off; U32 full_off_raw = strtbl->strblock_min + off;
@@ -993,7 +993,7 @@ pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off){
return(result); return(result);
} }
static String8 internal String8
pdb_strtbl_string_from_index(PDB_Strtbl *strtbl, PDB_StringIndex idx){ pdb_strtbl_string_from_index(PDB_Strtbl *strtbl, PDB_StringIndex idx){
String8 result = {0}; String8 result = {0};
if (idx < strtbl->bucket_count){ if (idx < strtbl->bucket_count){
@@ -1,8 +1,8 @@
// Copyright (c) 2024 Epic Games Tools // Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef RADDBGI_PDB_H #ifndef PDB_H
#define RADDBGI_PDB_H #define PDB_H
// https://github.com/microsoft/microsoft-pdb/tree/master/PDB // https://github.com/microsoft/microsoft-pdb/tree/master/PDB
@@ -127,7 +127,7 @@ typedef struct PDB_DbiHeader{
U32 ec_info_size; U32 ec_info_size;
PDB_DbiHeaderFlags flags; PDB_DbiHeaderFlags flags;
COFF_Arch machine; COFF_MachineType machine;
U32 reserved; U32 reserved;
} PDB_DbiHeader; } PDB_DbiHeader;
@@ -307,7 +307,7 @@ typedef struct PDB_Strtbl{
typedef struct PDB_DbiParsed{ typedef struct PDB_DbiParsed{
String8 data; String8 data;
COFF_Arch arch; COFF_MachineType machine_type;
MSF_StreamNumber gsi_sn; MSF_StreamNumber gsi_sn;
MSF_StreamNumber psi_sn; MSF_StreamNumber psi_sn;
MSF_StreamNumber sym_sn; MSF_StreamNumber sym_sn;
@@ -400,63 +400,63 @@ typedef struct PDB_CompUnitContributionArray{
//////////////////////////////// ////////////////////////////////
//~ PDB Parser Functions //~ PDB Parser Functions
static PDB_Info* pdb_info_from_data(Arena *arena, String8 pdb_info_data); internal PDB_Info* pdb_info_from_data(Arena *arena, String8 pdb_info_data);
static PDB_NamedStreamTable*pdb_named_stream_table_from_info(Arena *arena, PDB_Info *info); internal PDB_NamedStreamTable*pdb_named_stream_table_from_info(Arena *arena, PDB_Info *info);
static PDB_Strtbl* pdb_strtbl_from_data(Arena *arena, String8 strtbl_data); internal PDB_Strtbl* pdb_strtbl_from_data(Arena *arena, String8 strtbl_data);
static PDB_DbiParsed* pdb_dbi_from_data(Arena *arena, String8 dbi_data); internal PDB_DbiParsed* pdb_dbi_from_data(Arena *arena, String8 dbi_data);
static PDB_TpiParsed* pdb_tpi_from_data(Arena *arena, String8 tpi_data); internal PDB_TpiParsed* pdb_tpi_from_data(Arena *arena, String8 tpi_data);
static PDB_TpiHashParsed* pdb_tpi_hash_from_data(Arena *arena, internal PDB_TpiHashParsed* pdb_tpi_hash_from_data(Arena *arena,
PDB_Strtbl *strtbl, PDB_Strtbl *strtbl,
PDB_TpiParsed *tpi, PDB_TpiParsed *tpi,
String8 tpi_hash_data, String8 tpi_hash_data,
String8 tpi_hash_aux_data); String8 tpi_hash_aux_data);
static PDB_GsiParsed* pdb_gsi_from_data(Arena *arena, String8 gsi_data); internal PDB_GsiParsed* pdb_gsi_from_data(Arena *arena, String8 gsi_data);
static PDB_CoffSectionArray*pdb_coff_section_array_from_data(Arena *arena, internal PDB_CoffSectionArray*pdb_coff_section_array_from_data(Arena *arena,
String8 section_data); String8 section_data);
static PDB_CompUnitArray* pdb_comp_unit_array_from_data(Arena *arena, internal PDB_CompUnitArray* pdb_comp_unit_array_from_data(Arena *arena,
String8 module_info_data); String8 module_info_data);
static PDB_CompUnitContributionArray* internal PDB_CompUnitContributionArray*
pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 seccontrib_data, pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 seccontrib_data,
PDB_CoffSectionArray *sections); PDB_CoffSectionArray *sections);
//////////////////////////////// ////////////////////////////////
//~ PDB Definition Functions //~ PDB Definition Functions
static U32 pdb_string_hash1(String8 string); internal U32 pdb_string_hash1(String8 string);
//////////////////////////////// ////////////////////////////////
//~ PDB Dbi Functions //~ PDB Dbi Functions
static String8 pdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range); internal String8 pdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range);
static String8 pdb_data_from_unit_range(MSF_Parsed *msf, PDB_CompUnit *unit, internal String8 pdb_data_from_unit_range(MSF_Parsed *msf, PDB_CompUnit *unit,
PDB_DbiCompUnitRange range); PDB_DbiCompUnitRange range);
//////////////////////////////// ////////////////////////////////
//~ PDB Tpi Functions //~ PDB Tpi Functions
static String8 pdb_leaf_data_from_tpi(PDB_TpiParsed *tpi); internal String8 pdb_leaf_data_from_tpi(PDB_TpiParsed *tpi);
static CV_TypeIdArray pdb_tpi_itypes_from_name(Arena *arena, internal CV_TypeIdArray pdb_tpi_itypes_from_name(Arena *arena,
PDB_TpiHashParsed *tpi_hash, PDB_TpiHashParsed *tpi_hash,
CV_LeafParsed *tpi_leaf, CV_LeafParsed *tpi_leaf,
String8 name, String8 name,
B32 compare_unique_name, B32 compare_unique_name,
U32 output_cap); U32 output_cap);
static CV_TypeId pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, internal CV_TypeId pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash,
CV_LeafParsed *tpi_leaf, CV_LeafParsed *tpi_leaf,
String8 name, String8 name,
B32 compare_unique_name); B32 compare_unique_name);
//////////////////////////////// ////////////////////////////////
//~ PDB Strtbl Functions //~ PDB Strtbl Functions
static String8 pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off); internal String8 pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off);
static String8 pdb_strtbl_string_from_index(PDB_Strtbl *strtbl, internal String8 pdb_strtbl_string_from_index(PDB_Strtbl *strtbl,
PDB_StringIndex idx); PDB_StringIndex idx);
#endif //RADDBGI_PDB_H #endif // PDB_H
@@ -4,7 +4,7 @@
//////////////////////////////// ////////////////////////////////
//~ PDB Stringize Functions //~ PDB Stringize Functions
static void internal void
pdb_stringize_tpi_hash(Arena *arena, String8List *out, PDB_TpiHashParsed *hash){ pdb_stringize_tpi_hash(Arena *arena, String8List *out, PDB_TpiHashParsed *hash){
U32 bucket_count = hash->bucket_count; U32 bucket_count = hash->bucket_count;
str8_list_pushf(arena, out, "bucket_count=%u\n\n", bucket_count); str8_list_pushf(arena, out, "bucket_count=%u\n\n", bucket_count);
+12
View File
@@ -0,0 +1,12 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef PDB_STRINGIZE_H
#define PDB_STRINGIZE_H
////////////////////////////////
//~ PDB Stringize Functions
internal void pdb_stringize_tpi_hash(Arena *arena, String8List *out, PDB_TpiHashParsed *hash);
#endif // PDB_STRINGIZE_H
+17 -16
View File
@@ -4,11 +4,16 @@
//////////////////////////////// ////////////////////////////////
//~ rjf: Includes //~ rjf: Includes
//- rjf: [h] //- rjf: [lib]
#include "lib_raddbgi_format/raddbgi_format.h" #include "lib_raddbgi_format/raddbgi_format.h"
#include "lib_raddbgi_format/raddbgi_format_parse.h" #include "lib_raddbgi_format/raddbgi_format_parse.h"
#include "lib_raddbgi_format/raddbgi_format.c"
#include "lib_raddbgi_format/raddbgi_format_parse.c"
//- rjf: [h]
#include "base/base_inc.h" #include "base/base_inc.h"
#include "os/os_inc.h" #include "os/os_inc.h"
#include "raddbgi_cons_local/raddbgi_cons_local.h"
#include "mdesk/mdesk.h" #include "mdesk/mdesk.h"
#include "hash_store/hash_store.h" #include "hash_store/hash_store.h"
#include "file_stream/file_stream.h" #include "file_stream/file_stream.h"
@@ -17,16 +22,14 @@
#include "txti/txti.h" #include "txti/txti.h"
#include "coff/coff.h" #include "coff/coff.h"
#include "pe/pe.h" #include "pe/pe.h"
#include "raddbgi_cons_local/raddbgi_cons_local.h" #include "codeview/codeview.h"
#include "raddbgi_convert/pdb/raddbgi_coff.h" #include "codeview/codeview_stringize.h"
#include "raddbgi_convert/pdb/raddbgi_codeview.h" #include "msf/msf.h"
#include "raddbgi_convert/pdb/raddbgi_msf.h" #include "pdb/pdb.h"
#include "raddbgi_convert/pdb/raddbgi_pdb.h" #include "pdb/pdb_stringize.h"
#include "raddbgi_convert/pdb/raddbgi_coff_conversion.h" #include "raddbgi_convert/pdb/raddbgi_coff_conversion.h"
#include "raddbgi_convert/pdb/raddbgi_codeview_conversion.h" #include "raddbgi_convert/pdb/raddbgi_codeview_conversion.h"
#include "raddbgi_convert/pdb/raddbgi_from_pdb.h" #include "raddbgi_convert/pdb/raddbgi_from_pdb.h"
#include "raddbgi_convert/pdb/raddbgi_codeview_stringize.h"
#include "raddbgi_convert/pdb/raddbgi_pdb_stringize.h"
#include "regs/regs.h" #include "regs/regs.h"
#include "regs/raddbgi/regs_raddbgi.h" #include "regs/raddbgi/regs_raddbgi.h"
#include "type_graph/type_graph.h" #include "type_graph/type_graph.h"
@@ -47,10 +50,9 @@
#include "raddbg.h" #include "raddbg.h"
//- rjf: [c] //- rjf: [c]
#include "lib_raddbgi_format/raddbgi_format.c"
#include "lib_raddbgi_format/raddbgi_format_parse.c"
#include "base/base_inc.c" #include "base/base_inc.c"
#include "os/os_inc.c" #include "os/os_inc.c"
#include "raddbgi_cons_local/raddbgi_cons_local.c"
#include "mdesk/mdesk.c" #include "mdesk/mdesk.c"
#include "hash_store/hash_store.c" #include "hash_store/hash_store.c"
#include "file_stream/file_stream.c" #include "file_stream/file_stream.c"
@@ -59,14 +61,13 @@
#include "txti/txti.c" #include "txti/txti.c"
#include "coff/coff.c" #include "coff/coff.c"
#include "pe/pe.c" #include "pe/pe.c"
#include "raddbgi_cons_local/raddbgi_cons_local.c" #include "codeview/codeview.c"
#include "raddbgi_convert/pdb/raddbgi_msf.c" #include "codeview/codeview_stringize.c"
#include "raddbgi_convert/pdb/raddbgi_codeview.c" #include "msf/msf.c"
#include "raddbgi_convert/pdb/raddbgi_pdb.c" #include "pdb/pdb.c"
#include "pdb/pdb_stringize.c"
#include "raddbgi_convert/pdb/raddbgi_coff_conversion.c" #include "raddbgi_convert/pdb/raddbgi_coff_conversion.c"
#include "raddbgi_convert/pdb/raddbgi_codeview_conversion.c" #include "raddbgi_convert/pdb/raddbgi_codeview_conversion.c"
#include "raddbgi_convert/pdb/raddbgi_codeview_stringize.c"
#include "raddbgi_convert/pdb/raddbgi_pdb_stringize.c"
#include "raddbgi_convert/pdb/raddbgi_from_pdb.c" #include "raddbgi_convert/pdb/raddbgi_from_pdb.c"
#include "regs/regs.c" #include "regs/regs.c"
#include "regs/raddbgi/regs_raddbgi.c" #include "regs/raddbgi/regs_raddbgi.c"
@@ -1,10 +1,10 @@
// Copyright (c) 2024 Epic Games Tools // Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
#include "lib_raddbgi_format/raddbgi_format.h"
#include "base/base_inc.h" #include "base/base_inc.h"
#include "os/os_inc.h" #include "os/os_inc.h"
#include "raddbgi_format/raddbgi_format.h" #include "raddbgi_cons_local/raddbgi_cons_local.h"
#include "raddbgi_cons/raddbgi_cons_local.h"
#include "raddbgi_elf.h" #include "raddbgi_elf.h"
#include "raddbgi_dwarf.h" #include "raddbgi_dwarf.h"
@@ -13,10 +13,10 @@
#include "raddbgi_from_dwarf.h" #include "raddbgi_from_dwarf.h"
#include "lib_raddbgi_format/raddbgi_format.c"
#include "base/base_inc.c" #include "base/base_inc.c"
#include "os/os_inc.c" #include "os/os_inc.c"
#include "raddbgi_format/raddbgi_format.c" #include "raddbgi_cons_local/raddbgi_cons_local.c"
#include "raddbgi_cons/raddbgi_cons_local.c"
#include "raddbgi_elf.c" #include "raddbgi_elf.c"
#include "raddbgi_dwarf.c" #include "raddbgi_dwarf.c"
@@ -1,86 +0,0 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef RADDBGI_CODEVIEW_STRINGIZE_H
#define RADDBGI_CODEVIEW_STRINGIZE_H
////////////////////////////////
//~ CodeView Stringize Helper Types
typedef struct CV_StringizeSymParams{
CV_Arch arch;
} CV_StringizeSymParams;
typedef struct CV_StringizeLeafParams{
U32 dummy;
} CV_StringizeLeafParams;
////////////////////////////////
//~ CodeView Common Stringize Functions
static void cv_stringize_numeric(Arena *arena, String8List *out, CV_NumericParsed *num);
static void cv_stringize_lvar_addr_range(Arena *arena, String8List *out,
CV_LvarAddrRange *range);
static void cv_stringize_lvar_addr_gap(Arena *arena, String8List *out, CV_LvarAddrGap *gap);
static void cv_stringize_lvar_addr_gap_list(Arena *arena, String8List *out,
void *first, void *opl);
static String8 cv_string_from_sym_kind(CV_SymKind kind);
static String8 cv_string_from_basic_type(CV_BasicType basic_type);
static String8 cv_string_from_leaf_kind(CV_LeafKind kind);
static String8 cv_string_from_numeric_kind(CV_NumericKind kind);
static String8 cv_string_from_c13_sub_section_kind(CV_C13_SubSectionKind kind);
static String8 cv_string_from_machine(CV_Arch arch);
static String8 cv_string_from_reg(CV_Arch arch, CV_Reg reg);
static String8 cv_string_from_pointer_kind(CV_PointerKind ptr_kind);
static String8 cv_string_from_pointer_mode(CV_PointerMode ptr_mode);
static String8 cv_string_from_hfa_kind(CV_HFAKind hfa_kind);
static String8 cv_string_from_mo_com_udt_kind(CV_MoComUDTKind mo_com_udt_kind);
////////////////////////////////
//~ CodeView Flags Stringize Functions
static void cv_stringize_modifier_flags(Arena *arena, String8List *out,
U32 indent, CV_ModifierFlags flags);
static void cv_stringize_type_props(Arena *arena, String8List *out,
U32 indent, CV_TypeProps props);
static void cv_stringize_pointer_attribs(Arena *arena, String8List *out,
U32 indent, CV_PointerAttribs attribs);
static void cv_stringize_local_flags(Arena *arena, String8List *out,
U32 indent, CV_LocalFlags flags);
////////////////////////////////
//~ CodeView Sym Stringize Functions
static void cv_stringize_sym_parsed(Arena *arena, String8List *out, CV_SymParsed *sym);
static void cv_stringize_sym_range(Arena *arena, String8List *out,
CV_RecRange *range, String8 data,
CV_StringizeSymParams *p);
static void cv_stringize_sym_array(Arena *arena, String8List *out,
CV_RecRangeArray *ranges, String8 data,
CV_StringizeSymParams *p);
////////////////////////////////
//~ CodeView Leaf Stringize Functions
static void cv_stringize_leaf_parsed(Arena *arena, String8List *out, CV_LeafParsed *leaf);
static void cv_stringize_leaf_range(Arena *arena, String8List *out,
CV_RecRange *range, CV_TypeId itype, String8 data,
CV_StringizeLeafParams *p);
static void cv_stringize_leaf_array(Arena *arena, String8List *out,
CV_RecRangeArray *ranges, CV_TypeId itype_first,
String8 data,
CV_StringizeLeafParams *p);
////////////////////////////////
//~ CodeView C13 Stringize Functions
static void cv_stringize_c13_parsed(Arena *arena, String8List *out, CV_C13Parsed *c13);
#endif //RADDBGI_CODEVIEW_STRINGIZE_H
-52
View File
@@ -1,52 +0,0 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef RADDBGI_COFF_H
#define RADDBGI_COFF_H
////////////////////////////////
//~ COFF Format Types
typedef struct COFF_Guid{
U32 data1;
U16 data2;
U16 data3;
U32 data4;
U32 data5;
} COFF_Guid;
#define COFF_ArchXList(X)\
X(UNKNOWN, 0x0)\
X(X86, 0x14c)\
X(X64, 0x8664)\
X(ARM33, 0x1d3)\
X(ARM, 0x1c0)\
X(ARM64, 0xaa64)\
X(ARMNT, 0x1c4)\
X(EBC, 0xebc)\
X(IA64, 0x200)\
X(M32R, 0x9041)\
X(MIPS16, 0x266)\
X(MIPSFPU, 0x366)\
X(MIPSFPU16, 0x466)\
X(POWERPC, 0x1f0)\
X(POWERPCFP, 0x1f1)\
X(R4000, 0x166)\
X(RISCV32, 0x5032)\
X(RISCV64, 0x5064)\
X(RISCV128, 0x5128)\
X(SH3, 0x1a2)\
X(SH3DSP, 0x1a3)\
X(SH4, 0x1a6)\
X(SH5, 0x1a8)\
X(THUMB, 0x1c2)\
X(WCEMIPSV2, 0x169)
typedef U16 COFF_Arch;
enum{
#define X(N,c) COFF_Arch_##N = c,
COFF_ArchXList(X)
#undef X
};
#endif //COFF_H
@@ -7,7 +7,6 @@
//////////////////////////////// ////////////////////////////////
//~ COFF Conversion Functions //~ COFF Conversion Functions
static RADDBGI_BinarySectionFlags static RADDBGI_BinarySectionFlags raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags);
raddbgi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags);
#endif //RADDBGI_COFF_CONVERSION_H #endif //RADDBGI_COFF_CONVERSION_H
+13 -17
View File
@@ -2,38 +2,34 @@
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
#include "lib_raddbgi_format/raddbgi_format.h" #include "lib_raddbgi_format/raddbgi_format.h"
#include "lib_raddbgi_format/raddbgi_format.c"
#include "base/base_inc.h" #include "base/base_inc.h"
#include "os/os_inc.h" #include "os/os_inc.h"
#include "coff/coff.h" #include "coff/coff.h"
#include "codeview/codeview.h"
#include "codeview/codeview_stringize.h"
#include "msf/msf.h"
#include "pdb/pdb.h"
#include "pdb/pdb_stringize.h"
#include "raddbgi_cons_local/raddbgi_cons_local.h" #include "raddbgi_cons_local/raddbgi_cons_local.h"
#include "raddbgi_coff.h"
#include "raddbgi_codeview.h"
#include "raddbgi_msf.h"
#include "raddbgi_pdb.h"
#include "raddbgi_coff_conversion.h" #include "raddbgi_coff_conversion.h"
#include "raddbgi_codeview_conversion.h" #include "raddbgi_codeview_conversion.h"
#include "raddbgi_codeview_stringize.h"
#include "raddbgi_pdb_stringize.h"
#include "raddbgi_from_pdb.h" #include "raddbgi_from_pdb.h"
#include "lib_raddbgi_format/raddbgi_format.c"
#include "base/base_inc.c" #include "base/base_inc.c"
#include "coff/coff.c"
#include "os/os_inc.c" #include "os/os_inc.c"
#include "coff/coff.c"
#include "codeview/codeview.c"
#include "codeview/codeview_stringize.c"
#include "msf/msf.c"
#include "pdb/pdb.c"
#include "pdb/pdb_stringize.c"
#include "raddbgi_cons_local/raddbgi_cons_local.c" #include "raddbgi_cons_local/raddbgi_cons_local.c"
#include "raddbgi_msf.c"
#include "raddbgi_codeview.c"
#include "raddbgi_pdb.c"
#include "raddbgi_coff_conversion.c" #include "raddbgi_coff_conversion.c"
#include "raddbgi_codeview_conversion.c" #include "raddbgi_codeview_conversion.c"
#include "raddbgi_codeview_stringize.c"
#include "raddbgi_pdb_stringize.c"
#include "raddbgi_from_pdb.c" #include "raddbgi_from_pdb.c"
int int
@@ -1,12 +0,0 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef RADDBGI_PDB_STRINGIZE_H
#define RADDBGI_PDB_STRINGIZE_H
////////////////////////////////
//~ PDB Stringize Functions
static void pdb_stringize_tpi_hash(Arena *arena, String8List *out, PDB_TpiHashParsed *hash);
#endif //RADDBGI_PDB_STRINGIZE_H
+8 -6
View File
@@ -1,19 +1,21 @@
// Copyright (c) 2024 Epic Games Tools // Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
#include "lib_raddbgi_format/raddbgi_format.h"
#include "lib_raddbgi_format/raddbgi_format_parse.h"
#include "lib_raddbgi_format/raddbgi_format.c"
#include "lib_raddbgi_format/raddbgi_format_parse.c"
#include "base/base_inc.h" #include "base/base_inc.h"
#include "os/os_inc.h" #include "os/os_inc.h"
#include "raddbgi_format/raddbgi_format.h"
#include "raddbgi_format/raddbgi_format_parse.h"
#include "raddbgi_stringize/raddbgi_stringize.h"
#include "raddbgi_stringize.h"
#include "raddbgi_dump.h" #include "raddbgi_dump.h"
#include "base/base_inc.c" #include "base/base_inc.c"
#include "os/os_inc.c" #include "os/os_inc.c"
#include "raddbgi_format/raddbgi_format.c"
#include "raddbgi_format/raddbgi_format_parse.c" #include "raddbgi_stringize.c"
#include "raddbgi_stringize/raddbgi_stringize.c"
//////////////////////////////// ////////////////////////////////
//~ Program Parameters Parser //~ Program Parameters Parser
+6 -6
View File
@@ -1,12 +1,12 @@
// Copyright (c) 2024 Epic Games Tools // Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
#include "raddbgi_format/raddbgi_format.h" #include "lib_raddbgi_format/raddbgi_format.h"
#include "raddbgi_format/raddbgi_format.c" #include "lib_raddbgi_format/raddbgi_format.c"
#include "raddbgi_format/raddbgi_format_parse.h" #include "lib_raddbgi_format/raddbgi_format_parse.h"
#include "raddbgi_format/raddbgi_format_parse.c" #include "lib_raddbgi_format/raddbgi_format_parse.c"
#include "raddbgi_cons/raddbgi_cons.h" #include "lib_raddbgi_cons/raddbgi_cons.h"
#include "raddbgi_cons/raddbgi_cons.c" #include "lib_raddbgi_cons/raddbgi_cons.c"
int main(int argument_count, char **arguments) int main(int argument_count, char **arguments)
{ {