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:
Ryan Fleury
2024-02-21 13:43:56 -08:00
parent 25ef98a98c
commit f93b71d8c3
5 changed files with 1918 additions and 1608 deletions
File diff suppressed because it is too large Load Diff
+162 -29
View File
@@ -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
+29 -33
View File
@@ -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, &sections);
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;
}
+12 -42
View File
@@ -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
+12 -22
View File
@@ -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;