mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-23 20:24:59 -07:00
raddbgi_from_pdb: untangle all baking stages - move almost all baking stages to a strictly read-only path of strings, idx runs, and so on. make section layout, given some loose input baking params, completely deterministic & well-defined, such that section list building for each stage of baking can be completely independent
This commit is contained in:
+1703
-1482
File diff suppressed because it is too large
Load Diff
@@ -795,8 +795,6 @@ struct RDIM_ScopeChunkList
|
||||
////////////////////////////////
|
||||
//~ rjf: Baking Types
|
||||
|
||||
//- rjf: bake parameters
|
||||
|
||||
typedef struct RDIM_BakeParams RDIM_BakeParams;
|
||||
struct RDIM_BakeParams
|
||||
{
|
||||
@@ -812,8 +810,55 @@ struct RDIM_BakeParams
|
||||
RDIM_ScopeChunkList scopes;
|
||||
};
|
||||
|
||||
typedef struct RDIM_BakeSection RDIM_BakeSection;
|
||||
struct RDIM_BakeSection
|
||||
{
|
||||
void *data;
|
||||
RDI_U64 size;
|
||||
RDI_DataSectionTag tag;
|
||||
RDI_U64 tag_idx;
|
||||
};
|
||||
|
||||
typedef struct RDIM_BakeSectionNode RDIM_BakeSectionNode;
|
||||
struct RDIM_BakeSectionNode
|
||||
{
|
||||
RDIM_BakeSectionNode *next;
|
||||
RDIM_BakeSection v;
|
||||
};
|
||||
|
||||
typedef struct RDIM_BakeSectionList RDIM_BakeSectionList;
|
||||
struct RDIM_BakeSectionList
|
||||
{
|
||||
RDIM_BakeSectionNode *first;
|
||||
RDIM_BakeSectionNode *last;
|
||||
RDI_U64 count;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: [OLD] Baking Types
|
||||
|
||||
//- rjf: bake parameters
|
||||
|
||||
#if 0
|
||||
typedef struct RDIM_BakeParams RDIM_BakeParams;
|
||||
struct RDIM_BakeParams
|
||||
{
|
||||
RDIM_TopLevelInfo top_level_info;
|
||||
RDIM_BinarySectionList binary_sections;
|
||||
RDIM_UnitChunkList units;
|
||||
RDIM_TypeChunkList types;
|
||||
RDIM_UDTChunkList udts;
|
||||
RDIM_SrcFileChunkList src_files;
|
||||
RDIM_SymbolChunkList global_variables;
|
||||
RDIM_SymbolChunkList thread_variables;
|
||||
RDIM_SymbolChunkList procedures;
|
||||
RDIM_ScopeChunkList scopes;
|
||||
};
|
||||
#endif
|
||||
|
||||
//- rjf: data sections
|
||||
|
||||
#if 0
|
||||
typedef struct RDIM_BakeSection RDIM_BakeSection;
|
||||
struct RDIM_BakeSection
|
||||
{
|
||||
@@ -836,6 +881,7 @@ struct RDIM_BakeSectionList
|
||||
RDIM_BakeSectionNode *last;
|
||||
RDI_U64 count;
|
||||
};
|
||||
#endif
|
||||
|
||||
//- rjf: interned strings
|
||||
|
||||
@@ -949,8 +995,8 @@ struct RDIM_BakeNameMap
|
||||
|
||||
//- rjf: vmaps
|
||||
|
||||
typedef struct RDIM_VMap RDIM_VMap;
|
||||
struct RDIM_VMap
|
||||
typedef struct RDIM_BakeVMap RDIM_BakeVMap;
|
||||
struct RDIM_BakeVMap
|
||||
{
|
||||
RDI_VMapEntry *vmap; // [count + 1]
|
||||
RDI_U32 count;
|
||||
@@ -1016,12 +1062,12 @@ RDI_PROC RDIM_SortKey *rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys
|
||||
RDI_PROC void rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Binary Section Info Building
|
||||
//~ rjf: [Building] Binary Section Info Building
|
||||
|
||||
RDI_PROC RDIM_BinarySection *rdim_binary_section_list_push(RDIM_Arena *arena, RDIM_BinarySectionList *list);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Source File Info Building
|
||||
//~ rjf: [Building] Source File Info Building
|
||||
|
||||
RDI_PROC RDIM_SrcFile *rdim_src_file_chunk_list_push(RDIM_Arena *arena, RDIM_SrcFileChunkList *list, RDI_U64 cap);
|
||||
RDI_PROC RDI_U64 rdim_idx_from_src_file(RDIM_SrcFile *src_file);
|
||||
@@ -1029,7 +1075,7 @@ RDI_PROC void rdim_src_file_chunk_list_concat_in_place(RDIM_SrcFileChunkList *ds
|
||||
RDI_PROC void rdim_src_file_push_line_sequence(RDIM_Arena *arena, RDIM_SrcFileChunkList *src_files, RDIM_SrcFile *src_file, RDIM_LineSequence *seq);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Unit Info Building
|
||||
//~ rjf: [Building] Unit Info Building
|
||||
|
||||
RDI_PROC RDIM_Unit *rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list, RDI_U64 cap);
|
||||
RDI_PROC RDI_U64 rdim_idx_from_unit(RDIM_Unit *unit);
|
||||
@@ -1037,7 +1083,7 @@ RDI_PROC void rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM
|
||||
RDI_PROC RDIM_LineSequence *rdim_line_sequence_list_push(RDIM_Arena *arena, RDIM_LineSequenceList *list);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Type Info & UDT Building
|
||||
//~ rjf: [Building] Type Info & UDT Building
|
||||
|
||||
RDI_PROC RDIM_Type *rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 cap);
|
||||
RDI_PROC RDI_U64 rdim_idx_from_type(RDIM_Type *type);
|
||||
@@ -1049,14 +1095,14 @@ RDI_PROC RDIM_UDTMember *rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDTChunkLi
|
||||
RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Symbol Info Building
|
||||
//~ rjf: [Building] Symbol Info Building
|
||||
|
||||
RDI_PROC RDIM_Symbol *rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap);
|
||||
RDI_PROC RDI_U64 rdim_idx_from_symbol(RDIM_Symbol *symbol);
|
||||
RDI_PROC void rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Scope Info Building
|
||||
//~ rjf: [Building] Scope Info Building
|
||||
|
||||
//- rjf: scopes
|
||||
RDI_PROC RDIM_Scope *rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap);
|
||||
@@ -1082,35 +1128,122 @@ RDI_PROC RDIM_Location *rdim_push_location_val_reg(RDIM_Arena *arena, RDI_U8 reg
|
||||
RDI_PROC void rdim_location_set_push_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Rng1U64 voff_range, RDIM_Location *location);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Baking
|
||||
//~ rjf: [Baking Helpers] Baked File Layout Calculations
|
||||
|
||||
//- rjf: data section list building helpers
|
||||
RDI_PROC RDIM_BakeSection *rdim_bake_section_list_push(RDIM_Arena *arena, RDIM_BakeSectionList *list);
|
||||
RDI_PROC RDIM_BakeSection *rdim_bake_section_list_push_new(RDIM_Arena *arena, RDIM_BakeSectionList *list, void *data, RDI_U64 size, RDI_DataSectionTag tag);
|
||||
RDI_PROC RDI_U64 rdim_bake_section_count_from_params(RDIM_BakeParams *params);
|
||||
RDI_PROC RDI_U64 rdim_bake_section_idx_from_params_tag_idx(RDIM_BakeParams *params, RDI_DataSectionTag tag, RDI_U64 idx);
|
||||
|
||||
//- rjf: interned string map reading/writing
|
||||
RDI_PROC RDI_U32 rdim_idx_from_baked_string(RDIM_BakeStringMap *map, RDIM_String8 string);
|
||||
RDI_PROC RDI_U32 rdim_bake_string(RDIM_Arena *arena, RDIM_BakeStringMap *map, RDIM_String8 string);
|
||||
////////////////////////////////
|
||||
//~ rjf: [Baking Helpers] Baked VMap Building
|
||||
|
||||
//- rjf: interned index run building
|
||||
RDI_PROC RDIM_BakeVMap rdim_bake_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: [Baking Helpers] Interned / Deduplicated Blob Data Structure Helpers
|
||||
|
||||
//- rjf: bake string map reading/writing
|
||||
RDI_PROC RDI_U32 rdim_bake_idx_from_string(RDIM_BakeStringMap *map, RDIM_String8 string);
|
||||
RDI_PROC RDI_U32 rdim_bake_string_map_insert(RDIM_Arena *arena, RDIM_BakeStringMap *map, RDIM_String8 string);
|
||||
|
||||
//- rjf: bake idx run map reading/writing
|
||||
RDI_PROC RDI_U64 rdim_hash_from_idx_run(RDI_U32 *idx_run, RDI_U32 count);
|
||||
RDI_PROC RDI_U32 rdim_bake_idx_run(RDIM_Arena *arena, RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count);
|
||||
RDI_PROC RDI_U32 rdim_bake_idx_from_idx_run(RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count);
|
||||
RDI_PROC RDI_U32 rdim_bake_idx_run_map_insert(RDIM_Arena *arena, RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count);
|
||||
|
||||
//- rjf: interned path/file building
|
||||
RDI_PROC RDIM_String8 rdim_normal_string_from_bake_path_node(RDIM_Arena *arena, RDIM_BakePathNode *node);
|
||||
RDI_PROC RDIM_BakePathNode *rdim_bake_path_node_from_string(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string);
|
||||
RDI_PROC RDI_U32 rdim_bake_path(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string);
|
||||
//- rjf: bake path tree reading/writing
|
||||
RDI_PROC RDIM_BakePathNode *rdim_bake_path_node_from_string(RDIM_BakePathTree *tree, RDIM_String8 string);
|
||||
RDI_PROC RDI_U32 rdim_bake_path_node_idx_from_string(RDIM_BakePathTree *tree, RDIM_String8 string);
|
||||
RDI_PROC RDIM_BakePathNode *rdim_bake_path_tree_insert(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string);
|
||||
|
||||
//- rjf: name maps
|
||||
//- rjf: bake name maps writing
|
||||
RDI_PROC void rdim_bake_name_map_push(RDIM_Arena *arena, RDIM_BakeNameMap *map, RDIM_String8 string, RDI_U32 idx);
|
||||
|
||||
//- rjf: vmap baking
|
||||
RDI_PROC RDIM_VMap rdim_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count);
|
||||
////////////////////////////////
|
||||
//~ rjf: [Baking Helpers] Data Section List Building Helpers
|
||||
|
||||
//- rjf: main baking entry point
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_sections_from_params(RDIM_Arena *arena, RDIM_BakeParams *params);
|
||||
RDI_PROC RDIM_BakeSection *rdim_bake_section_list_push(RDIM_Arena *arena, RDIM_BakeSectionList *list);
|
||||
RDI_PROC RDIM_BakeSection *rdim_bake_section_list_push_new(RDIM_Arena *arena, RDIM_BakeSectionList *list, void *data, RDI_U64 size, RDI_DataSectionTag tag, RDI_U64 tag_idx);
|
||||
RDI_PROC void rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDIM_BakeSectionList *to_push);
|
||||
|
||||
//- rjf: sections -> flattened serialized blobs
|
||||
////////////////////////////////
|
||||
//~ rjf: [Baking] Build Artifacts -> Interned/Deduplicated Data Structures
|
||||
|
||||
//- rjf: bake string map building
|
||||
RDI_PROC RDIM_BakeStringMap rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: bake idx run map building
|
||||
RDI_PROC RDIM_BakeIdxRunMap rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: bake path tree building
|
||||
RDI_PROC RDIM_BakePathTree rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: bake name map building
|
||||
RDI_PROC RDIM_BakeNameMap rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, RDIM_BakeParams *params);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: [Baking] Build Artifacts -> Data Section Lists
|
||||
|
||||
//- rjf: top-level info
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_top_level_info_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: binary sections
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_binary_section_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: units
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_unit_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: unit vmap
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_unit_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: source files
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_src_file_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: type nodes
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_type_node_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: UDTs
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_udt_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: global variables
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_global_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: global vmap
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_global_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: thread variables
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_thread_variable_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: procedures
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_procedure_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: scopes
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_scope_section_list_from_params(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: scope vmap
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_scope_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams *params);
|
||||
|
||||
//- rjf: name maps
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_name_map_section_list_from_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT]);
|
||||
|
||||
//- rjf: file paths
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_file_path_section_list_from_path_tree(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree);
|
||||
|
||||
//- rjf: strings
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_string_section_list_from_string_map(RDIM_Arena *arena, RDIM_BakeStringMap *strings);
|
||||
|
||||
//- rjf: index runs
|
||||
RDI_PROC RDIM_BakeSectionList rdim_bake_idx_run_section_list_from_idx_run_map(RDIM_Arena *arena, RDIM_BakeIdxRunMap *idx_runs);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: [Serializing] Baked Data Section List -> Serialized Binary Strings
|
||||
|
||||
RDI_PROC RDIM_String8List rdim_serialized_strings_from_params_bake_section_list(RDIM_Arena *arena, RDIM_BakeParams *params, RDIM_BakeSectionList *sections);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: [OLD] Baking
|
||||
|
||||
#if 0
|
||||
RDI_PROC RDIM_String8List rdim_blobs_from_bake_sections(RDIM_Arena *arena, RDIM_BakeSectionList *sections);
|
||||
#endif
|
||||
|
||||
#endif // RADDBGI_MAKE_H
|
||||
|
||||
@@ -36,10 +36,10 @@ p2r_hash_from_voff(U64 voff)
|
||||
////////////////////////////////
|
||||
//~ rjf: Command Line -> Conversion Inputs
|
||||
|
||||
internal P2R_ConvertIn *
|
||||
p2r_convert_in_from_cmd_line(Arena *arena, CmdLine *cmdline)
|
||||
internal P2R_User2Convert *
|
||||
p2r_user2convert_from_cmdln(Arena *arena, CmdLine *cmdline)
|
||||
{
|
||||
P2R_ConvertIn *result = push_array(arena, P2R_ConvertIn, 1);
|
||||
P2R_User2Convert *result = push_array(arena, P2R_User2Convert, 1);
|
||||
|
||||
//- rjf: get input pdb
|
||||
{
|
||||
@@ -1740,8 +1740,8 @@ p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p)
|
||||
////////////////////////////////
|
||||
//~ rjf: Top-Level Conversion Entry Point
|
||||
|
||||
internal P2R_ConvertOut *
|
||||
p2r_convert(Arena *arena, P2R_ConvertIn *in)
|
||||
internal P2R_Convert2Bake *
|
||||
p2r_convert(Arena *arena, P2R_User2Convert *in)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
@@ -3355,18 +3355,18 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in)
|
||||
//////////////////////////////////////////////////////////////
|
||||
//- rjf: fill output
|
||||
//
|
||||
P2R_ConvertOut *out = push_array(arena, P2R_ConvertOut, 1);
|
||||
P2R_Convert2Bake *out = push_array(arena, P2R_Convert2Bake, 1);
|
||||
{
|
||||
out->top_level_info = top_level_info;
|
||||
out->binary_sections = binary_sections;
|
||||
out->units = all_units;
|
||||
out->types = all_types;
|
||||
out->udts = all_udts;
|
||||
out->src_files = all_src_files;
|
||||
out->global_variables = all_global_variables;
|
||||
out->thread_variables = all_thread_variables;
|
||||
out->procedures = all_procedures;
|
||||
out->scopes = all_scopes;
|
||||
out->bake_params.top_level_info = top_level_info;
|
||||
out->bake_params.binary_sections = binary_sections;
|
||||
out->bake_params.units = all_units;
|
||||
out->bake_params.types = all_types;
|
||||
out->bake_params.udts = all_udts;
|
||||
out->bake_params.src_files = all_src_files;
|
||||
out->bake_params.global_variables = all_global_variables;
|
||||
out->bake_params.thread_variables = all_thread_variables;
|
||||
out->bake_params.procedures = all_procedures;
|
||||
out->bake_params.scopes = all_scopes;
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
@@ -3376,25 +3376,21 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in)
|
||||
////////////////////////////////
|
||||
//~ rjf: Top-Level Baking Entry Point
|
||||
|
||||
internal P2R_BakeOut *
|
||||
p2r_bake(Arena *arena, P2R_BakeIn *in)
|
||||
internal P2R_Bake2Serialize *
|
||||
p2r_bake(Arena *arena, P2R_Convert2Bake *in)
|
||||
{
|
||||
RDIM_BakeParams bake_params = {0};
|
||||
//////////////////////////////
|
||||
//- rjf: build all sections
|
||||
//
|
||||
RDIM_BakeSectionList sections = {0};
|
||||
{
|
||||
bake_params.top_level_info = in->top_level_info;
|
||||
bake_params.binary_sections = in->binary_sections;
|
||||
bake_params.units = in->units;
|
||||
bake_params.types = in->types;
|
||||
bake_params.udts = in->udts;
|
||||
bake_params.src_files = in->src_files;
|
||||
bake_params.global_variables = in->global_variables;
|
||||
bake_params.thread_variables = in->thread_variables;
|
||||
bake_params.procedures = in->procedures;
|
||||
bake_params.scopes = in->scopes;
|
||||
|
||||
}
|
||||
RDIM_BakeSectionList sections = rdim_bake_sections_from_params(arena, &bake_params);
|
||||
String8List bake_strings = rdim_blobs_from_bake_sections(arena, §ions);
|
||||
P2R_BakeOut *out = push_array(arena, P2R_BakeOut, 1);
|
||||
out->blobs = bake_strings;
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: fill & return
|
||||
//
|
||||
P2R_Bake2Serialize *out = push_array(arena, P2R_Bake2Serialize, 1);
|
||||
out->sections = sections;
|
||||
return out;
|
||||
}
|
||||
|
||||
@@ -5,17 +5,16 @@
|
||||
#define RADDBGI_FROM_PDB_H
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Conversion Inputs/Outputs
|
||||
//~ rjf: Conversion Stage Inputs/Outputs
|
||||
|
||||
typedef struct P2R_ConvertIn P2R_ConvertIn;
|
||||
struct P2R_ConvertIn
|
||||
typedef struct P2R_User2Convert P2R_User2Convert;
|
||||
struct P2R_User2Convert
|
||||
{
|
||||
String8 input_pdb_name;
|
||||
String8 input_pdb_data;
|
||||
String8 input_exe_name;
|
||||
String8 input_exe_data;
|
||||
String8 output_name;
|
||||
|
||||
struct
|
||||
{
|
||||
B8 input;
|
||||
@@ -23,7 +22,6 @@ struct P2R_ConvertIn
|
||||
B8 parsing;
|
||||
B8 converting;
|
||||
} hide_errors;
|
||||
|
||||
B8 dump;
|
||||
B8 dump__first;
|
||||
B8 dump_coff_sections;
|
||||
@@ -35,47 +33,19 @@ struct P2R_ConvertIn
|
||||
B8 dump_contributions;
|
||||
B8 dump_table_diagnostics;
|
||||
B8 dump__last;
|
||||
|
||||
String8List errors;
|
||||
};
|
||||
|
||||
typedef struct P2R_ConvertOut P2R_ConvertOut;
|
||||
struct P2R_ConvertOut
|
||||
typedef struct P2R_Convert2Bake P2R_Convert2Bake;
|
||||
struct P2R_Convert2Bake
|
||||
{
|
||||
RDIM_TopLevelInfo top_level_info;
|
||||
RDIM_BinarySectionList binary_sections;
|
||||
RDIM_UnitChunkList units;
|
||||
RDIM_TypeChunkList types;
|
||||
RDIM_UDTChunkList udts;
|
||||
RDIM_SrcFileChunkList src_files;
|
||||
RDIM_SymbolChunkList global_variables;
|
||||
RDIM_SymbolChunkList thread_variables;
|
||||
RDIM_SymbolChunkList procedures;
|
||||
RDIM_ScopeChunkList scopes;
|
||||
RDIM_BakeParams bake_params;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Baking Inputs/Outputs
|
||||
|
||||
typedef struct P2R_BakeIn P2R_BakeIn;
|
||||
struct P2R_BakeIn
|
||||
typedef struct P2R_Bake2Serialize P2R_Bake2Serialize;
|
||||
struct P2R_Bake2Serialize
|
||||
{
|
||||
RDIM_TopLevelInfo top_level_info;
|
||||
RDIM_BinarySectionList binary_sections;
|
||||
RDIM_UnitChunkList units;
|
||||
RDIM_TypeChunkList types;
|
||||
RDIM_UDTChunkList udts;
|
||||
RDIM_SrcFileChunkList src_files;
|
||||
RDIM_SymbolChunkList global_variables;
|
||||
RDIM_SymbolChunkList thread_variables;
|
||||
RDIM_SymbolChunkList procedures;
|
||||
RDIM_ScopeChunkList scopes;
|
||||
};
|
||||
|
||||
typedef struct P2R_BakeOut P2R_BakeOut;
|
||||
struct P2R_BakeOut
|
||||
{
|
||||
String8List blobs;
|
||||
RDIM_BakeSectionList sections;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
@@ -258,7 +228,7 @@ internal U64 p2r_hash_from_voff(U64 voff);
|
||||
////////////////////////////////
|
||||
//~ rjf: Command Line -> Conversion Inputs
|
||||
|
||||
internal P2R_ConvertIn *p2r_convert_in_from_cmd_line(Arena *arena, CmdLine *cmdline);
|
||||
internal P2R_User2Convert *p2r_user2convert_from_cmdln(Arena *arena, CmdLine *cmdline);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: COFF => RADDBGI Canonical Conversions
|
||||
@@ -311,11 +281,11 @@ internal void *p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p
|
||||
////////////////////////////////
|
||||
//~ rjf: Top-Level Conversion Entry Point
|
||||
|
||||
internal P2R_ConvertOut *p2r_convert(Arena *arena, P2R_ConvertIn *in);
|
||||
internal P2R_Convert2Bake *p2r_convert(Arena *arena, P2R_User2Convert *in);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Top-Level Baking Entry Point
|
||||
|
||||
internal P2R_BakeOut *p2r_bake(Arena *arena, P2R_BakeIn *in);
|
||||
internal P2R_Bake2Serialize *p2r_bake(Arena *arena, P2R_Convert2Bake *in);
|
||||
|
||||
#endif // RADDBGI_FROM_PDB_H
|
||||
|
||||
@@ -57,7 +57,7 @@ main(int argc, char **argv)
|
||||
String8List args = os_string_list_from_argcv(arena, argc, argv);
|
||||
CmdLine cmdline = cmd_line_from_string_list(arena, args);
|
||||
B32 should_capture = cmd_line_has_flag(&cmdline, str8_lit("capture"));
|
||||
P2R_ConvertIn *convert_in = p2r_convert_in_from_cmd_line(arena, &cmdline);
|
||||
P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, &cmdline);
|
||||
|
||||
//- rjf: begin capture
|
||||
if(should_capture)
|
||||
@@ -66,47 +66,37 @@ main(int argc, char **argv)
|
||||
}
|
||||
|
||||
//- rjf: display errors with input
|
||||
if(convert_in->errors.node_count > 0 && !convert_in->hide_errors.input)
|
||||
if(user2convert->errors.node_count > 0 && !user2convert->hide_errors.input)
|
||||
{
|
||||
for(String8Node *n = convert_in->errors.first; n != 0; n = n->next)
|
||||
for(String8Node *n = user2convert->errors.first; n != 0; n = n->next)
|
||||
{
|
||||
fprintf(stderr, "error(input): %.*s\n", str8_varg(n->string));
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: convert
|
||||
P2R_ConvertOut *convert_out = 0;
|
||||
P2R_Convert2Bake *convert2bake = 0;
|
||||
ProfScope("convert")
|
||||
{
|
||||
convert_out = p2r_convert(arena, convert_in);
|
||||
convert2bake = p2r_convert(arena, user2convert);
|
||||
}
|
||||
|
||||
//- rjf: bake
|
||||
P2R_BakeOut *bake_out = 0;
|
||||
P2R_Bake2Serialize *bake2srlz = 0;
|
||||
ProfScope("bake")
|
||||
{
|
||||
P2R_BakeIn bake_in = {0};
|
||||
{
|
||||
bake_in.top_level_info = convert_out->top_level_info;
|
||||
bake_in.binary_sections = convert_out->binary_sections;
|
||||
bake_in.units = convert_out->units;
|
||||
bake_in.types = convert_out->types;
|
||||
bake_in.udts = convert_out->udts;
|
||||
bake_in.src_files = convert_out->src_files;
|
||||
bake_in.global_variables = convert_out->global_variables;
|
||||
bake_in.thread_variables = convert_out->thread_variables;
|
||||
bake_in.procedures = convert_out->procedures;
|
||||
bake_in.scopes = convert_out->scopes;
|
||||
}
|
||||
bake_out = p2r_bake(arena, &bake_in);
|
||||
bake2srlz = p2r_bake(arena, convert2bake);
|
||||
}
|
||||
|
||||
//- rjf: serialize
|
||||
String8List serialize_out = rdim_serialized_strings_from_params_bake_section_list(arena, &convert2bake->bake_params, &bake2srlz->sections);
|
||||
|
||||
//- rjf: write
|
||||
ProfScope("write")
|
||||
{
|
||||
OS_Handle output_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, convert_in->output_name);
|
||||
OS_Handle output_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, user2convert->output_name);
|
||||
U64 off = 0;
|
||||
for(String8Node *n = bake_out->blobs.first; n != 0; n = n->next)
|
||||
for(String8Node *n = serialize_out.first; n != 0; n = n->next)
|
||||
{
|
||||
os_file_write(output_file, r1u64(off, off+n->string.size), n->string.str);
|
||||
off += n->string.size;
|
||||
|
||||
Reference in New Issue
Block a user